diff --git a/ASTPlayground/ASTPlayground.delphilsp.json b/ASTPlayground/ASTPlayground.delphilsp.json index fcd3bfc..6dc5fe8 100644 --- a/ASTPlayground/ASTPlayground.delphilsp.json +++ b/ASTPlayground/ASTPlayground.delphilsp.json @@ -1 +1 @@ -{ "settings": { "project": "file:///T%3A/Myc/ASTPlayground/ASTPlayground.dpr", "dllname": "dcc64370.dll", "dccOptions": "-$O- -$W+ --inline:off -$R+ -$Q+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win64\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Bpl\\Win64 -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NU.\\Win64\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -OT:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -R\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -U\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -V -VN -VR -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\hpp\\Win64 -NO.\\Win64\\Debug -LU" , "projectFiles":[ { "name": "MainForm", "file": "file:///T%3A/Myc/ASTPlayground/MainForm.pas" }, { "name": "Myc.Ast.Evaluator", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Evaluator.pas" }, { "name": "Myc.Ast.Nodes", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Nodes.pas" }, { "name": "Myc.Ast.Scope", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Scope.pas" }, { "name": "Myc.Data.Value", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Data.Value.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Visitor", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Visitor.pas" }, { "name": "Myc.Ast.RTL", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.pas" }, { "name": "Myc.Ast.Dumper", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Dumper.pas" }, { "name": "Myc.Ast.RTL.Core", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Core.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Text", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Fmx.AstEditor.Text.pas" }, { "name": "Myc.Utils", "file": "file:///T%3A/Myc/Src/Myc.Utils.pas" }, { "name": "Myc.Ast.Script", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.pas" }, { "name": "Myc.Ast.Types", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Types.pas" }, { "name": "Myc.Data.Keyword", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Keyword.pas" }, { "name": "Myc.Ast.Compiler.TCO", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TCO.pas" }, { "name": "Myc.Ast.Compiler.Binder", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Binder.pas" }, { "name": "Myc.Ast.Compiler.Lowering", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Lowering.pas" }, { "name": "Myc.Ast.Compiler.TypeChecker", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TypeChecker.pas" }, { "name": "Myc.Ast.Compiler.Macros", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Macros.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": false, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/FlatBox2D","file:///C%3A/Users/Public/Documents/Embarcadero/Studio/37.0/Dcp/%25PLATFORM%25","file:///%25TP%25/runtime/vcl","file:///S%3A/sc_famos_src/svn_vcl/cpxedits","file:///S%3A/sc_famos_src/svn_vcl/dzChart","file:///S%3A/sc_famos_src/svn_vcl/eaeditor","file:///S%3A/sc_famos_src/svn_vcl/FamosEvents","file:///S%3A/sc_famos_src/svn_vcl/HTML_Viewer/source","file:///S%3A/sc_famos_src/svn_vcl/Myc_ChartEdit","file:///S%3A/sc_famos_src/svn_vcl/Myc_HemiDrag","file:///S%3A/sc_famos_src/svn_vcl/Myc_SplitControl","file:///S%3A/sc_famos_src/svn_vcl/NiceChart","file:///S%3A/sc_famos_src/svn_vcl/plotter","file:///S%3A/sc_famos_src/svn_vcl/SimpleIPC","file:///S%3A/sc_famos_src/svn_vcl/SynEdit-master/Source","file:///S%3A/sc_famos_src/svn_vcl/ValEdits","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib/win32","file:///S%3A/sc_famos_src/svn_vcl/Virtual-TreeView/Source","file:///S%3A/sc_famos_src/svn_common/caHelpSys","file:///S%3A/sc_famos_src/svn_common/Misc","file:///S%3A/sc_famos_src/svn_common/Myc_VecMath","file:///S%3A/sc_famos_src/svn_common/PascalScript/source","file:///S%3A/sc_famos_src/svn_common/TreeBase","file:///S%3A/sc_famos_src/svn_common/TreeBase/Medien","file:///S%3A/3rdParty/spring4d/Source","file:///S%3A/3rdParty/spring4d/Source/Base","file:///S%3A/3rdParty/spring4d/Source/Base/Collections","file:///S%3A/3rdParty/spring4d/Source/Base/Logging","file:///S%3A/3rdParty/spring4d/Source/Base/Patches","file:///S%3A/3rdParty/spring4d/Source/Core/Container","file:///S%3A/3rdParty/spring4d/Source/Core/Interception","file:///S%3A/3rdParty/spring4d/Source/Core/Logging","file:///S%3A/3rdParty/spring4d/Source/Core/Mocking","file:///S%3A/3rdParty/spring4d/Source/Core/Services","file:///S%3A/3rdParty/spring4d/Source/Extensions/Cryptography","file:///S%3A/3rdParty/spring4d/Source/Extensions/Utils","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressSkins%20Library/Sources","file:///T%3A/Myc/Src","file:///T%3A/Myc/Src/Data","file:///T%3A/Myc/Src/AST" ] , "CommonAppData": "file:///C%3A/Users/Brummel/AppData/Roaming/Embarcadero/BDS/37.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/ObjRepos/" } } \ No newline at end of file +{ "settings": { "project": "file:///T%3A/Myc/ASTPlayground/ASTPlayground.dpr", "dllname": "dcc64370.dll", "dccOptions": "-$O- -$W+ --inline:off -$R+ -$Q+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win64\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Bpl\\Win64 -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NU.\\Win64\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -OT:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -R\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -U\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -V -VN -VR -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\hpp\\Win64 -NO.\\Win64\\Debug -LU" , "projectFiles":[ { "name": "MainForm", "file": "file:///T%3A/Myc/ASTPlayground/MainForm.pas" }, { "name": "Myc.Ast.Evaluator", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Evaluator.pas" }, { "name": "Myc.Ast.Nodes", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Nodes.pas" }, { "name": "Myc.Ast.Scope", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Scope.pas" }, { "name": "Myc.Data.Value", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Data.Value.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Visitor", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Visitor.pas" }, { "name": "Myc.Ast.RTL", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.pas" }, { "name": "Myc.Ast.Dumper", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Dumper.pas" }, { "name": "Myc.Ast.RTL.Core", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Core.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Text", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Fmx.AstEditor.Text.pas" }, { "name": "Myc.Utils", "file": "file:///T%3A/Myc/Src/Myc.Utils.pas" }, { "name": "Myc.Ast.Script", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.pas" }, { "name": "Myc.Ast.Types", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Types.pas" }, { "name": "Myc.Data.Keyword", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Keyword.pas" }, { "name": "Myc.Ast.Compiler.TCO", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TCO.pas" }, { "name": "Myc.Ast.Compiler.Binder", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Binder.pas" }, { "name": "Myc.Ast.Compiler.Lowering", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Lowering.pas" }, { "name": "Myc.Ast.Compiler.TypeChecker", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TypeChecker.pas" }, { "name": "Myc.Ast.Compiler.Macros", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Macros.pas" }, { "name": "Unit1", "file": "file:///T%3A/Myc/ASTPlayground/Unit1.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": true, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/FlatBox2D","file:///C%3A/Users/Public/Documents/Embarcadero/Studio/37.0/Dcp/%25PLATFORM%25","file:///%25TP%25/runtime/vcl","file:///S%3A/sc_famos_src/svn_vcl/cpxedits","file:///S%3A/sc_famos_src/svn_vcl/dzChart","file:///S%3A/sc_famos_src/svn_vcl/eaeditor","file:///S%3A/sc_famos_src/svn_vcl/FamosEvents","file:///S%3A/sc_famos_src/svn_vcl/HTML_Viewer/source","file:///S%3A/sc_famos_src/svn_vcl/Myc_ChartEdit","file:///S%3A/sc_famos_src/svn_vcl/Myc_HemiDrag","file:///S%3A/sc_famos_src/svn_vcl/Myc_SplitControl","file:///S%3A/sc_famos_src/svn_vcl/NiceChart","file:///S%3A/sc_famos_src/svn_vcl/plotter","file:///S%3A/sc_famos_src/svn_vcl/SimpleIPC","file:///S%3A/sc_famos_src/svn_vcl/SynEdit-master/Source","file:///S%3A/sc_famos_src/svn_vcl/ValEdits","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib/win32","file:///S%3A/sc_famos_src/svn_vcl/Virtual-TreeView/Source","file:///S%3A/sc_famos_src/svn_common/caHelpSys","file:///S%3A/sc_famos_src/svn_common/Misc","file:///S%3A/sc_famos_src/svn_common/Myc_VecMath","file:///S%3A/sc_famos_src/svn_common/PascalScript/source","file:///S%3A/sc_famos_src/svn_common/TreeBase","file:///S%3A/sc_famos_src/svn_common/TreeBase/Medien","file:///S%3A/3rdParty/spring4d/Source","file:///S%3A/3rdParty/spring4d/Source/Base","file:///S%3A/3rdParty/spring4d/Source/Base/Collections","file:///S%3A/3rdParty/spring4d/Source/Base/Logging","file:///S%3A/3rdParty/spring4d/Source/Base/Patches","file:///S%3A/3rdParty/spring4d/Source/Core/Container","file:///S%3A/3rdParty/spring4d/Source/Core/Interception","file:///S%3A/3rdParty/spring4d/Source/Core/Logging","file:///S%3A/3rdParty/spring4d/Source/Core/Mocking","file:///S%3A/3rdParty/spring4d/Source/Core/Services","file:///S%3A/3rdParty/spring4d/Source/Extensions/Cryptography","file:///S%3A/3rdParty/spring4d/Source/Extensions/Utils","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressSkins%20Library/Sources","file:///T%3A/Myc/Src","file:///T%3A/Myc/Src/Data","file:///T%3A/Myc/Src/AST" ] , "CommonAppData": "file:///C%3A/Users/Brummel/AppData/Roaming/Embarcadero/BDS/37.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/ObjRepos/" } } \ No newline at end of file diff --git a/ASTPlayground/ASTPlayground.dpr b/ASTPlayground/ASTPlayground.dpr index 2a72ba9..05cc2b1 100644 --- a/ASTPlayground/ASTPlayground.dpr +++ b/ASTPlayground/ASTPlayground.dpr @@ -25,7 +25,8 @@ uses Myc.Ast.Compiler.Binder in '..\Src\AST\Myc.Ast.Compiler.Binder.pas', Myc.Ast.Compiler.Lowering in '..\Src\AST\Myc.Ast.Compiler.Lowering.pas', Myc.Ast.Compiler.TypeChecker in '..\Src\AST\Myc.Ast.Compiler.TypeChecker.pas', - Myc.Ast.Compiler.Macros in '..\Src\AST\Myc.Ast.Compiler.Macros.pas'; + Myc.Ast.Compiler.Macros in '..\Src\AST\Myc.Ast.Compiler.Macros.pas', + Myc.Ast.Environment in '..\Src\AST\Myc.Ast.Environment.pas'; {$R *.res} diff --git a/ASTPlayground/ASTPlayground.dproj b/ASTPlayground/ASTPlayground.dproj index 9149cef..891f971 100644 --- a/ASTPlayground/ASTPlayground.dproj +++ b/ASTPlayground/ASTPlayground.dproj @@ -156,6 +156,7 @@ + Base diff --git a/ASTPlayground/MainForm.fmx b/ASTPlayground/MainForm.fmx index 7e88d5b..bb4714e 100644 --- a/ASTPlayground/MainForm.fmx +++ b/ASTPlayground/MainForm.fmx @@ -111,6 +111,7 @@ object Form1: TForm1 Position.Y = 439.000000000000000000 TabOrder = 14 Text = 'Debug' + OnChange = DebugBoxChange end object FromJSONButton: TButton Position.X = 24.000000000000000000 diff --git a/ASTPlayground/MainForm.pas b/ASTPlayground/MainForm.pas index e6388f6..b839dc7 100644 --- a/ASTPlayground/MainForm.pas +++ b/ASTPlayground/MainForm.pas @@ -28,26 +28,18 @@ uses Myc.Ast.Scope, Myc.Ast, Myc.Ast.Visitor, - Myc.Ast.Evaluator, - Myc.Ast.Dumper, Myc.Data.Decimal, - Myc.Ast.RTL, Myc.Ast.Script, FMX.Layouts, FMX.Objects, - Myc.Ast.Debugger, Myc.Fmx.AstEditor.Node, Myc.Fmx.AstEditor.Workspace, - Myc.Ast.Compiler.Macros, - Myc.Ast.Compiler.Binder, - Myc.Ast.Compiler.TypeChecker, - Myc.Ast.Compiler.Lowering, - Myc.Ast.Compiler.TCO, FMX.DialogService, FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, - FMX.ListView; + FMX.ListView, + Myc.Ast.Environment; // Added Environment type // A test record @@ -94,6 +86,7 @@ type procedure ClearButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure CreateTriggerExampleButtonClick(Sender: TObject); + procedure DebugBoxChange(Sender: TObject); procedure DoTrigger2ButtonClick(Sender: TObject); procedure DoTriggerButtonClick(Sender: TObject); procedure DumpButtonClick(Sender: TObject); @@ -116,18 +109,16 @@ type procedure RTLListViewChange(Sender: TObject); private FCurrUnboundAst: IAstNode; - FCurrAst: IAstNode; - FCurrDesc: IScopeDescriptor; - FGScope: IExecutionScope; + FCurrExec: IExecutable; // Replaced FCurrAst and FCurrDesc + FEnvironment: TAstEnvironment; FWorkspace: TAuraWorkspace; - FTriggerScope: IExecutionScope; FScriptUpdate: Boolean; + FTriggerTest: TAstEnvironment; procedure WorkspaceMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); - function CreateEvaluator(const Scope: IExecutionScope): IEvaluatorVisitor; - // Helper function to encapsulate the compilation pipeline - function CompileAst(const ANode: IAstNode; const AParentScope: IExecutionScope; out ADescriptor: IScopeDescriptor): IAstNode; + + function CreateEnvironment: TAstEnvironment; // Helper function to encapsulate the Compile -> Evaluate pattern - function ExecuteAst(const ANode: IAstNode; const AParentScope: IExecutionScope): TDataValue; + function ExecuteAst(const ANode: IAstNode): TDataValue; procedure UpdateScript; procedure ShowVizualization(X, Y: Single); procedure PrintScript(const Node: IAstNode); @@ -149,7 +140,10 @@ uses System.TimeSpan, Myc.Ast.Json, // For TAstJson serialization Myc.Ast.Types, // Needed for TTypeRules - System.IOUtils; // For TFile + System.IOUtils, // For TFile + Myc.Ast.Dumper, // Needed for DumpButtonClick + Myc.Ast.RTL, + Myc.Ast.Compiler.Macros; // Needed for MacroRegistry access {$R *.fmx} @@ -199,7 +193,7 @@ begin ] ); - resultValue := ExecuteAst(mainBlock, FGScope); + resultValue := ExecuteAst(mainBlock); Assert(TScalar.FromInt64(15) = resultValue.AsScalar, 'The final result should be 15, but is ' + resultValue.AsScalar.ToString); UpdateScript; @@ -209,67 +203,64 @@ procedure TForm1.ClearButtonClick(Sender: TObject); begin FWorkspace.DeleteChildren; FWorkspace.Repaint; - - FGScope := TAst.CreateScope(nil); end; -function TForm1.CompileAst(const ANode: IAstNode; const AParentScope: IExecutionScope; out ADescriptor: IScopeDescriptor): IAstNode; -var - expandedAst, boundAst, typedAst, loweredAst: IAstNode; +function TForm1.CreateEnvironment: TAstEnvironment; begin - // Step 1: Expand macros (Phase 1) - expandedAst := TMacroExpander.ExpandMacros(AParentScope, ANode, CreateEvaluator); - - // Step 2: Bind names and addresses (Phase 2) - boundAst := TAstBinder.Bind(AParentScope, expandedAst, ADescriptor); - - // Step 3: Check and infer types (Phase 3) - typedAst := TTypeChecker.CheckTypes(boundAst, ADescriptor); - - // Step 4: Lowering / Canonicalization (Phase 4) - loweredAst := TAstLowerer.Lower(typedAst); - - // Step 5: Tail Call Optimization (Phase 5) - Result := TAstTCO.Optimize(loweredAst); + if DebugBox.IsChecked then + Result.SetDebugMode(Memo1.Lines, ShowScopeBox.IsChecked) + else + Result.SetStandardMode; end; -function TForm1.ExecuteAst(const ANode: IAstNode; const AParentScope: IExecutionScope): TDataValue; -var - descriptor: IScopeDescriptor; - evalScope: IExecutionScope; - visitor: IEvaluatorVisitor; - compiledAst: IAstNode; +// Simplified ExecuteAst using TEnvironment +function TForm1.ExecuteAst(const ANode: IAstNode): TDataValue; begin FCurrUnboundAst := ANode; + FCurrExec := nil; // Clear previous - // Call the helper function for the full 4-stage pipeline - compiledAst := CompileAst(ANode, AParentScope, descriptor); + // 1. Set strategy based on UI + if DebugBox.IsChecked then + FEnvironment.SetDebugMode(Memo1.Lines, ShowScopeBox.IsChecked) + else + FEnvironment.SetStandardMode; - // Store the final bound AST for visualization and debugging. - FCurrAst := compiledAst; // <-- Store the fully compiled AST - FCurrDesc := descriptor; + try + // 2. Compile (Pipeline is inside Environment) + // We store the executable artifact in the form + FCurrExec := FEnvironment.Compile(ANode); - // Create the final scope and evaluator for runtime execution. - evalScope := descriptor.CreateScope(AParentScope); - visitor := CreateEvaluator(evalScope); - Result := visitor.Execute(compiledAst); + // 3. Execute + Result := FEnvironment.Execute(FCurrExec); + + except + on E: Exception do + begin + Memo1.Lines.Add('--- ERROR ---'); + Memo1.Lines.Add(E.ClassName + ': ' + E.Message); + Result := TDataValue.Void; + end; + end; end; procedure TForm1.FormCreate(Sender: TObject); begin + FEnvironment := CreateEnvironment; + FWorkspace := TAuraWorkspace.Create(Panel2); FWorkspace.Parent := Panel2; FWorkspace.Align := TAlignLayout.Client; FWorkspace.ClipChildren := true; FWorkspace.OnMouseDown := WorkspaceMouseDown; - TAst.RegisterLibrary( + RegisterRtlFunctions(FEnvironment.RootScope); + + // Register the SMA factory into the environment + var RegFunc := procedure(const Scope: IExecutionScope) var - smaAst, typedAst: IAstNode; - smaDescriptor: IScopeDescriptor; - smaScope: IExecutionScope; - smaVisitor: IEvaluatorVisitor; + smaAst: IAstNode; + smaExec: IExecutable; begin smaAst := TAst.LambdaExpr( @@ -322,14 +313,15 @@ begin ) ); - // Run the full pipeline - typedAst := CompileAst(smaAst, Scope, smaDescriptor); + // Compile the SMA factory using the environment itself + // Note: We pass FEnvironment.RootScope as the parent scope + smaExec := FEnvironment.Compile(smaAst); - smaScope := smaDescriptor.CreateScope(Scope); - smaVisitor := CreateEvaluator(smaScope); + // Execute the compiled AST to define the 'CreateSMA' function in the target scope + // We must use the *target* scope (Scope) as the parent for execution. + var smaFactory := FEnvironment.Execute(smaExec); - // Execute the typed AST to define the function - smaVisitor.Execute(typedAst); + Scope.Define('CreateSMA', smaFactory); // Define the factory Scope.Define( 'print', @@ -360,22 +352,24 @@ begin Result := TStopwatch.GetTimeStamp div TTimeSpan.TicksPerMillisecond; end ); + end; - TMacroExpander.GlobalMacroRegistry.Define( - TAstScript - .Parse( - ''' - (defmacro stopwatch [body] - `(do - (def start-time (timestamp)) - (def result ~body) - (print "Stopwatch: " (- (timestamp) start-time) "ms" ) - result - )) - ''') - .AsMacroDefinition - ); - end + RegFunc(FEnvironment.RootScope); + + // Register the 'stopwatch' macro into the global registry + FEnvironment.MacroRegistry.Define( + TAstScript + .Parse( + ''' + (defmacro stopwatch [body] + `(do + (def start-time (timestamp)) + (def result ~body) + (print "(calculated in " (- (timestamp) start-time) " ms)" ) + result + )) + ''') + .AsMacroDefinition ); ClearButtonClick(Self); @@ -406,7 +400,7 @@ begin try Memo1.Lines.Add(Format('--- Loading User Library from %s ---', [ExtractFileName(UserLibName)])); - var scopeDescr := FGScope.CreateDescriptor; + var scopeDescr := FEnvironment.RootScope.CreateDescriptor; // Populate the list view with loaded functions and macros. RTLListView.Items.BeginUpdate; try @@ -424,15 +418,15 @@ begin // Distinguish between loading a macro and loading a function. if funcAst.Kind = akMacroDefinition then begin - // Macros are stored as raw AST nodes in the scope. - FGScope.Define(pair.JsonString.Value, TDataValue.FromIntf(funcAst)); + // Macros are stored in the *global compile-time registry*. + FEnvironment.MacroRegistry.Define(funcAst.AsMacroDefinition); Memo1.Lines.Add(Format('Defined macro "%s"', [pair.JsonString.Value])); end else begin // Functions (lambdas) must be executed to create a callable closure. - funcValue := ExecuteAst(funcAst, FGScope); - FGScope.Define(pair.JsonString.Value, funcValue); + funcValue := ExecuteAst(funcAst); + FEnvironment.RootScope.Define(pair.JsonString.Value, funcValue); Memo1.Lines.Add(Format('Defined function "%s"', [pair.JsonString.Value])); end; end @@ -602,8 +596,14 @@ begin try var unboundAst := converter.Deserialize(jsonObj); + // Set strategy based on UI + if DebugBox.IsChecked then + FEnvironment.SetDebugMode(Memo1.Lines, ShowScopeBox.IsChecked) + else + FEnvironment.SetStandardMode; + // Run the full pipeline - FCurrAst := CompileAst(unboundAst, FGScope, FCurrDesc); + FCurrExec := FEnvironment.Compile(unboundAst); Memo1.Lines.Add('AST deserialized and bound successfully from JSON.'); Memo1.Lines.Add('You can now visualize it (Middle Mouse Click) or pretty-print it.'); @@ -613,8 +613,7 @@ begin except on E: Exception do begin - FCurrAst := nil; - FCurrDesc := nil; + FCurrExec := nil; Memo1.Lines.Add('Error deserializing AST from JSON:'); Memo1.Lines.Add(E.Message); Memo1.Lines.Add('--- Original JSON ---'); @@ -634,7 +633,7 @@ var begin Memo1.Lines.Clear; - if not Assigned(FCurrAst) then + if not Assigned(FCurrExec) then begin Memo1.Lines.Add('No AST available to serialize. Please generate one first.'); exit; @@ -642,7 +641,7 @@ begin try converter := TJsonAstConverter.Create; - jsonObj := converter.Serialize(FCurrAst); + jsonObj := converter.Serialize(FCurrExec.CompiledAst); try Memo1.Lines.Text := jsonObj.Format(4); finally @@ -658,92 +657,74 @@ begin end; procedure TForm1.DumpButtonClick(Sender: TObject); -var - typedNode: IAstNode; begin Memo1.Lines.Clear; Memo1.Lines.Add('--- AST Dump ---'); - if not Assigned(FCurrUnboundAst) then + if not Assigned(FCurrExec) then // Check FCurrExec begin - Memo1.Lines.Add('No AST has been generated yet. Click a test button first.'); + Memo1.Lines.Add('No *compiled* AST has been generated yet. Click a test button first.'); exit; end; - // Re-run the full pipeline for the dump - typedNode := CompileAst(FCurrUnboundAst, FGScope, FCurrDesc); - - TAstDumper.Dump(typedNode, Memo1.Lines); + // Dump the compiled AST from the executable + TAstDumper.Dump(FCurrExec.CompiledAst, Memo1.Lines); end; procedure TForm1.FibonacciButtonClick(Sender: TObject); var - root, fibAst, typedAst: IAstNode; result: TDataValue; sw: TStopwatch; - fibScope: IExecutionScope; - visitor: IEvaluatorVisitor; - desc: IScopeDescriptor; + fibDataValue: TDataValue; begin - fibAst := - TAst.Block( - [ - TAst.VarDecl(TAst.Identifier('fib')), - TAst.Assign( - TAst.Identifier('fib'), - TAst.LambdaExpr( - [TAst.Identifier('n')], - TAst.TernaryExpr( - TAst.BinaryExpr(TAst.Identifier('n'), TScalar.TBinaryOp.Less, TAst.Constant(2)), - TAst.Identifier('n'), - TAst.BinaryExpr( - TAst.FunctionCall( - TAst.Identifier('fib'), - [TAst.BinaryExpr(TAst.Identifier('n'), TScalar.TBinaryOp.Subtract, TAst.Constant(1))] - ), - TScalar.TBinaryOp.Add, - TAst.FunctionCall( - TAst.Identifier('fib'), - [TAst.BinaryExpr(TAst.Identifier('n'), TScalar.TBinaryOp.Subtract, TAst.Constant(2))] - ) - ) - ) - ) - ) - ] + Memo1.Lines.Clear; + + FCurrUnboundAst := + TAstScript.Parse( + ''' + (do + (def fib) + (assign fib (fn [n] + (? (< n 2) + n + (+ (fib (- n 1)) (fib (- n 2))) + ) + )) + ) + ''' ); - // Run the full pipeline - typedAst := CompileAst(fibAst, FGScope, desc); - fibScope := desc.CreateScope(FGScope); + var TestEnv := FEnvironment.CreateEnvironment; - visitor := CreateEvaluator(fibScope); - visitor.Execute(typedAst); + TestEnv.Define('fib', TAst.Block(FCurrUnboundAst)); - Memo1.Lines.Clear; Memo1.Lines.Add('--- Naive recursive fib with AST---'); - sw := TStopwatch.StartNew; - root := TAst.FunctionCall(TAst.Identifier('fib'), [TAst.Constant(25)]); - result := ExecuteAst(root, fibScope); + var fibExec := TestEnv.Compile(TAst.FunctionCall(TAst.Identifier('fib'), [TAst.Constant(25)])); + + sw := TStopwatch.StartNew; + result := TestEnv.Execute(fibExec); sw.Stop; Memo1.Lines.Add(Format('Result: fib(25) %s (calculated in %d ms)', [result.ToString, sw.ElapsedMilliseconds])); Memo1.Lines.Add(''); + Memo1.Lines.Add('--- Memoized naive fib with AST (using global fib)---'); + + var memoizeTest := TestEnv.CreateEnvironment; + + memoizeTest.Define('fib', TAstScript.Parse('(Memoize fib)')); + + var memoizeExec := memoizeTest.Compile(TAstScript.Parse('(fib 25)')); + sw := TStopwatch.StartNew; - - root := - TAst.Block( - [ - TAst.Assign(TAst.Identifier('fib'), TAst.FunctionCall(TAst.Identifier('Memoize'), [TAst.Identifier('fib')])), - TAst.FunctionCall(TAst.Identifier('fib'), [TAst.Constant(25)]) - ] - ); - - result := ExecuteAst(root, fibScope); + result := memoizeTest.Execute(memoizeExec); sw.Stop; - Memo1.Lines.Add(Format('Result: fib(25) %s (calculated in %d ms)', [result.ToString, sw.ElapsedMilliseconds])); + Memo1.Lines.Add(Format('Result 1st call: fib(25) %s (calculated in %d ms)', [result.ToString, sw.ElapsedMilliseconds])); + sw := TStopwatch.StartNew; + result := memoizeTest.Execute(memoizeExec); + sw.Stop; + Memo1.Lines.Add(Format('Result 2nd call: fib(25) %s (calculated in %d ms)', [result.ToString, sw.ElapsedMilliseconds])); UpdateScript; end; @@ -753,13 +734,14 @@ begin Memo1.Lines.Clear; Memo1.Lines.Add('--- AST Pretty Print ---'); - if not Assigned(FCurrAst) then + // We print the *compiled* AST + if not Assigned(FCurrExec) then begin Memo1.Lines.Add('No AST has been generated yet.'); exit; end; - Memo1.Lines.Add(TAstScript.Print(FCurrAst)); + Memo1.Lines.Add(TAstScript.Print(FCurrExec.CompiledAst)); end; procedure TForm1.RecursionButtonClick(Sender: TObject); @@ -772,7 +754,6 @@ begin Memo1.Lines.Add('--- Tail-Recursive factorial(20) ---'); sw := TStopwatch.StartNew; - // Rewritten to be tail-recursive to use 'recur' root := TAst.Block( [ @@ -806,8 +787,8 @@ begin ] ); - // Execute with FGScope as parent. - result := ExecuteAst(root, FGScope); + // Execute with RootScope as parent. + result := ExecuteAst(root); sw.Stop; Memo1.Lines.Add(Format('Result: %s (calculated in %d ms)', [result.ToString, sw.ElapsedMilliseconds])); @@ -821,13 +802,11 @@ var series: TScalarRecordSeries; recordDef: IScalarRecordDefinition; i: Integer; - scope: IExecutionScope; values: TArray; begin Memo1.Lines.Clear; Memo1.Lines.Add('--- Series Test ---'); - scope := TAst.CreateScope(FGScope); recordDef := TRttiAstHelper.JsonToRecordDefinition(TRttiAstHelper.RecordDefinitionToJson); series := TScalarRecordSeries.Create(recordDef); SetLength(values, 6); @@ -842,7 +821,10 @@ begin values[5].AsInt64 := 10000 * (i + 1); series.Add(TScalarRecord.Create(recordDef, values)); end; - scope.Define('ohlcvSeries', TDataValue.FromRecordSeries(series)); + + var testEnv := FEnvironment.CreateEnvironment; + + testEnv.RootScope.Define('ohlcvSeries', TDataValue.FromRecordSeries(series)); ast := TAst.LambdaExpr( @@ -852,7 +834,6 @@ begin TAst.VarDecl( TAst.Identifier('closeColumn'), TAst.FunctionCall(TAst.Keyword('Close'), [TAst.Identifier('ohlcvSeries')]) - // TAst.MemberAccess(TAst.Identifier('ohlcvSeries'), TAst.Identifier('Close')) ), TAst.Indexer(TAst.Identifier('closeColumn'), TAst.Constant(1)) ] @@ -860,7 +841,8 @@ begin ); callAst := TAst.FunctionCall(ast, []); - resultValue := ExecuteAst(callAst, scope); + + resultValue := testEnv.CompileAndExecute(callAst); Memo1.Lines.Add(Format('Result of script: %s', [resultValue.ToString])); UpdateScript; @@ -920,7 +902,7 @@ begin ] ); - result := ExecuteAst(root, FGScope); + result := ExecuteAst(root); sw.Stop; Memo1.Lines.Add(Format('Result of the final expression: %s (calculated in %d ms)', [result.ToString, sw.ElapsedMilliseconds])); @@ -941,90 +923,46 @@ const smaSlowLength = 20; smaFastLength = 10; var - scope: IExecutionScope; values: TArray; recordValue: TScalarRecord; - setupAst, boundCallAst, callAst, typedAst: IAstNode; - setupDescriptor, callDescriptor: IScopeDescriptor; - seriesAddress: TResolvedSymbol; // Use TResolvedSymbol + setupAst: IAstNode; + callExec: IExecutable; begin Memo1.Lines.Clear; Memo1.Lines.Add(Format('--- Simulating O(1) SMA Crossover Strategy for %d ticks ---', [numRecs])); var sw := TStopwatch.StartNew; setupAst := - TAst.Block( - [ - TAst.VarDecl(TAst.Identifier('smaFast'), TAst.FunctionCall(TAst.Identifier('CreateSMA'), [TAst.Constant(smaFastLength)])), - TAst.VarDecl(TAst.Identifier('smaSlow'), TAst.FunctionCall(TAst.Identifier('CreateSMA'), [TAst.Constant(smaSlowLength)])), - TAst.VarDecl( - TAst.Identifier('maCrossStrategy'), - TAst.LambdaExpr( - [TAst.Identifier('ohlcv')], - TAst.Block( - [ - TAst.VarDecl( - TAst.Identifier('closeSeries'), - TAst.MemberAccess(TAst.Identifier('ohlcv'), TAst.Keyword('Close')) - ), - TAst.VarDecl( - TAst.Identifier('currentClose'), - TAst.Indexer(TAst.Identifier('closeSeries'), TAst.Constant(0)) - ), - TAst.VarDecl( - TAst.Identifier('valSmaFast'), - TAst.FunctionCall( - TAst.Identifier('smaFast'), - [TAst.Identifier('closeSeries'), TAst.Identifier('currentClose')] - ) - ), - TAst.VarDecl( - TAst.Identifier('valSmaSlow'), - TAst.FunctionCall( - TAst.Identifier('smaSlow'), - [TAst.Identifier('closeSeries'), TAst.Identifier('currentClose')] - ) - ), - TAst.TernaryExpr( - TAst.BinaryExpr( - TAst.Identifier('valSmaFast'), - TScalar.TBinaryOp.Greater, - TAst.Identifier('valSmaSlow') - ), - TAst.Constant(1), - TAst.Constant(-1) - ) - ] - ) - ) + TAstScript.Parse( + ''' + (do + (def smaFast (CreateSMA 10)) + (def smaSlow (CreateSMA 20)) + (fn [ohlcv] + (do + (def closeSeries (:Close ohlcv)) + (def currentClose (get closeSeries 0)) + (def valSmaFast (smaFast closeSeries currentClose)) + (def valSmaSlow (smaSlow closeSeries currentClose)) + (? (> valSmaFast valSmaSlow) 1 -1) ) - ] + ) + ) + ''' ); - // 1. Compile and execute the setup script. - typedAst := CompileAst(setupAst, FGScope, setupDescriptor); - scope := setupDescriptor.CreateScope(FGScope); - var setupVisitor := CreateEvaluator(scope); - setupVisitor.Execute(typedAst); + FCurrUnboundAst := setupAst; + UpdateScript; + Application.ProcessMessages; - // 2. Prepare for the simulation loop - scope.Define('current_series', TDataValue.Void); - var currentSeriesIdent := TAst.Identifier('current_series'); - callAst := TAst.FunctionCall(TAst.Identifier('maCrossStrategy'), [currentSeriesIdent]); + var env := FEnvironment.CreateEnvironment; - // 3. Re-compile the call AST within the now-populated scope to resolve the new variable. - boundCallAst := CompileAst(callAst, scope, callDescriptor); + env.Define('maCrossStrategy', setupAst); - // 4. Get the address of 'current_series' from the new descriptor. - seriesAddress := callDescriptor.FindSymbol('current_series'); - // Check seriesAddress.Address.Kind instead of seriesAddress.Kind - if seriesAddress.Address.Kind = akUnresolved then - raise Exception.Create('Could not resolve current_series address.'); + var seriesAddress := env.RootScope.Define('current_series', TDataValue.Void); - // 5. Create the final scope and visitor for the simulation loop. - var loopScope := callDescriptor.CreateScope(scope); - var visitor := CreateEvaluator(loopScope); + callExec := env.Compile(TAst.FunctionCall(TAst.Identifier('maCrossStrategy'), [TAst.Identifier('current_series')])); - // 6. Simulation Loop + // Simulation Loop Memo1.Lines.Clear; Memo1.Lines.Add('Starting simulation...'); Application.ProcessMessages; @@ -1058,9 +996,10 @@ begin if series.AsRecordSeries.TotalCount >= smaSlowLength then begin - // Use seriesAddress.Address instead of seriesAddress - loopScope[seriesAddress.Address] := series; - var resultValue := visitor.Execute(boundCallAst); + env.RootScope[seriesAddress] := series; + + var resultValue := env.Execute(callExec); + if i mod 50 = 0 then begin Memo1.Lines.Add(Format('Tick %d/%d: Close = %.2f, Signal = %s', [i, numRecs, ohlcvRec.Close, resultValue.ToString])); @@ -1106,7 +1045,7 @@ begin ] ); - result := ExecuteAst(root, FGScope); + result := ExecuteAst(root); sw.Stop; Memo1.Lines.Add(Format('Result: %s', [result.ToString])); @@ -1117,7 +1056,6 @@ end; procedure TForm1.CreateTriggerExampleButtonClick(Sender: TObject); var blk: IAstNode; - visitor: IEvaluatorVisitor; begin Memo1.Lines.Clear; Memo1.Lines.Add('--- Creating Trigger Blueprint ---'); @@ -1138,33 +1076,37 @@ begin ] ); - // Run the pipeline - FCurrAst := CompileAst(blk, FGScope, FCurrDesc); - FTriggerScope := FCurrDesc.CreateScope(FGScope); + FTriggerTest := FEnvironment.CreateEnvironment; - visitor := CreateEvaluator(FTriggerScope); - visitor.Execute(FCurrAst); + FTriggerTest.Define('X', TAst.VarDecl(TAst.Identifier('X'), TAst.Constant(0))); + FTriggerTest.Define( + 'tickHandler', + TAst.LambdaExpr( + [TAst.Identifier('summand')], + TAst.Assign(TAst.Identifier('X'), TAst.BinaryExpr(TAst.Identifier('X'), TScalar.TBinaryOp.Add, TAst.Identifier('summand'))) + ) + ); Memo1.Lines.Add('Variable "X" and function "tickHandler" defined in persistent scope.'); Memo1.Lines.Add('Click "Do Trigger" to execute.'); UpdateScript; end; -function TForm1.CreateEvaluator(const Scope: IExecutionScope): IEvaluatorVisitor; +procedure TForm1.DebugBoxChange(Sender: TObject); begin if DebugBox.IsChecked then - Result := TDebugEvaluatorVisitor.Create(Scope, Memo1.Lines, ShowScopeBox.IsChecked) + FEnvironment.SetDebugMode(Memo1.Lines, ShowScopeBox.IsChecked) else - Result := TEvaluatorVisitor.Create(Scope); + FEnvironment.SetStandardMode; end; procedure TForm1.DoTriggerButtonClick(Sender: TObject); var - callAst: IFunctionCallNode; + callAst: IAstNode; begin callAst := TAst.FunctionCall(TAst.Identifier('tickHandler'), [TAst.Constant(1)]); - var X := ExecuteAst(callAst, FTriggerScope); + var X := FTriggerTest.CompileAndExecute(callAst); Memo1.Lines.Add(Format('Tick(1)! New value of X: %s', [X.ToString])); UpdateScript; @@ -1172,11 +1114,11 @@ end; procedure TForm1.DoTrigger2ButtonClick(Sender: TObject); var - callAst: IFunctionCallNode; + callAst: IAstNode; begin callAst := TAst.FunctionCall(TAst.Identifier('tickHandler'), [TAst.Constant(2)]); - var X := ExecuteAst(callAst, FTriggerScope); + var X := FTriggerTest.CompileAndExecute(callAst); Memo1.Lines.Add(Format('Tick(2)! New value of X: %s', [X.ToString])); UpdateScript; @@ -1184,16 +1126,13 @@ end; procedure TForm1.ExternalFuncButtonClick(Sender: TObject); var - scope: IExecutionScope; callAst: IAstNode; resultValue: TDataValue; begin Memo1.Lines.Clear; Memo1.Lines.Add('--- Calling external Delphi function from AST ---'); - scope := TAst.CreateScope(FGScope); - - scope.Define( + FEnvironment.RootScope.Define( 'delphiAdd', function(const ArgNodes: TArray): TDataValue var @@ -1209,7 +1148,7 @@ begin callAst := TAst.FunctionCall(TAst.Identifier('delphiAdd'), [TAst.Constant(100), TAst.Constant(123)]); - resultValue := ExecuteAst(callAst, scope); + resultValue := ExecuteAst(callAst); Memo1.Lines.Add(Format('Result from delphiAdd(100, 123): %s', [resultValue.ToString])); UpdateScript; end; @@ -1246,7 +1185,7 @@ begin Memo1.Lines.Clear; Memo1.Lines.Add('--- Executing Corrected Upvalue Test ---'); - resultValue := ExecuteAst(mainBlock, FGScope); + resultValue := ExecuteAst(mainBlock); var res := resultValue.AsScalar.Value.AsInt64; if res = 15 then @@ -1347,7 +1286,7 @@ begin try try // Execute the entire script block when it changes - var result := ExecuteAst(TAstScript.Parse(ScriptMemo.Lines.Text), FGScope); + var result := ExecuteAst(TAstScript.Parse(ScriptMemo.Lines.Text)); Memo1.Lines.Add(Format('Script executed. Final result: %s', [result.ToString])); finally ShowVizualization(14, 14); @@ -1372,14 +1311,14 @@ begin FWorkspace.Build(FCurrUnboundAst, TPointF.Create(X, Y)); // - // if FCurrAst <> nil then - // begin - // FWorkspace.Build(FCurrAst, TPointF.Create(X, Y)); - // end - // else if FCurrUnboundAst <> nil then - // begin - // FWorkspace.Build(FCurrUnboundAst, TPointF.Create(X, Y)); - // end; + // if FCurrExec <> nil then + // begin + // FWorkspace.Build(FCurrExec.CompiledAst, TPointF.Create(X, Y)); + // end + // else if FCurrUnboundAst <> nil then + // begin + // FWorkspace.Build(FCurrUnboundAst, TPointF.Create(X, Y)); + // end; end; end. diff --git a/IntfExtract/Macros 1.md b/IntfExtract/Macros 1.md new file mode 100644 index 0000000..e69de29 diff --git a/Src/AST/Myc.Ast.Compiler.Binder.pas b/Src/AST/Myc.Ast.Compiler.Binder.pas index bc78915..7fa76d3 100644 --- a/Src/AST/Myc.Ast.Compiler.Binder.pas +++ b/Src/AST/Myc.Ast.Compiler.Binder.pas @@ -26,7 +26,6 @@ type type TUpvalueMapping = TDictionary; private - FInitialScope: IExecutionScope; FCurrentDescriptor: IScopeDescriptor; FUpvalueStack: TStack; FNestedLambdaCount: Integer; @@ -54,12 +53,12 @@ type function VisitSeriesLength(const Node: ISeriesLengthNode): IAstNode; override; public - constructor Create(const AInitialScope: IExecutionScope); + constructor Create(const AInitialDescriptor: IScopeDescriptor); destructor Destroy; override; function Execute(const RootNode: IAstNode; out Descriptor: IScopeDescriptor): IAstNode; class function Bind( - const InitialScope: IExecutionScope; + const InitialDescriptor: IScopeDescriptor; const RootNode: IAstNode; out Descriptor: IScopeDescriptor ): IAstNode; static; @@ -96,13 +95,12 @@ end; { TAstBinder } -constructor TAstBinder.Create(const AInitialScope: IExecutionScope); +constructor TAstBinder.Create(const AInitialDescriptor: IScopeDescriptor); begin inherited Create; - Assert(Assigned(AInitialScope)); + Assert(Assigned(AInitialDescriptor)); - FInitialScope := AInitialScope; - FCurrentDescriptor := AInitialScope.CreateDescriptor; + FCurrentDescriptor := AInitialDescriptor; FUpvalueStack := TObjectStack.Create(True); // Use Comparer FNestedLambdaCount := 0; FBoxedDeclarations := nil; @@ -115,9 +113,13 @@ begin inherited; end; -class function TAstBinder.Bind(const InitialScope: IExecutionScope; const RootNode: IAstNode; out Descriptor: IScopeDescriptor): IAstNode; +class function TAstBinder.Bind( + const InitialDescriptor: IScopeDescriptor; + const RootNode: IAstNode; + out Descriptor: IScopeDescriptor +): IAstNode; begin - var binder := TAstBinder.Create(InitialScope) as IAstBinder; + var binder := TAstBinder.Create(InitialDescriptor) as IAstBinder; Result := binder.Execute(RootNode, Descriptor); end; @@ -155,7 +157,6 @@ begin try EnterScope; try - // Main pass: Run the mutator Result := Accept(RootNode); // Accept returns IAstNode if not Assigned(Result) then Result := TAst.Block([]); diff --git a/Src/AST/Myc.Ast.Compiler.Macros.pas b/Src/AST/Myc.Ast.Compiler.Macros.pas index b386bcd..78308d8 100644 --- a/Src/AST/Myc.Ast.Compiler.Macros.pas +++ b/Src/AST/Myc.Ast.Compiler.Macros.pas @@ -12,11 +12,12 @@ uses Myc.Ast.Visitor, Myc.Ast.Scope, Myc.Ast.Types, - Myc.Ast; + Myc.Ast, + Myc.Ast.Environment; // Added for IMacroRegistry type IAstMacroExpander = interface(IAstVisitor) - // Signatur geändert: Descriptor wird nicht mehr zurückgegeben + // Signatur geaendert: Descriptor wird nicht mehr zurueckgegeben function Execute(const RootNode: IAstNode): IAstNode; end; @@ -46,28 +47,10 @@ type // This transformer traverses the entire AST *before* the binder, // to find and expand macros. TMacroExpander = class(TAstTransformer, IAstMacroExpander) - type - TMacroRegistry = class - private - FParent: TMacroRegistry; - FMacros: TDictionary; - public - constructor Create(AParent: TMacroRegistry); - destructor Destroy; override; - procedure Define(const Node: IMacroDefinitionNode); - function Find(const Name: string): IMacroDefinitionNode; - end; - - strict private - class var - FGlobalMacroRegistry: TMacroRegistry; - class constructor CreateClass; - class destructor DestroyClass; - private FInitialScope: IExecutionScope; - FCurrentMacroRegistry: TMacroRegistry; + FCurrentMacroRegistry: IMacroRegistry; // Changed from TMacroRegistry FEvaluatorFactory: TEvaluatorFactory; @@ -87,18 +70,23 @@ type function VisitLambdaExpression(const Node: ILambdaExpressionNode): IAstNode; override; public - constructor Create(const AInitialScope: IExecutionScope; const AEvaluatorFactory: TEvaluatorFactory); - destructor Destroy; override; + // Updated Constructor + constructor Create( + const ARootRegistry: IMacroRegistry; + const AInitialScope: IExecutionScope; + const AEvaluatorFactory: TEvaluatorFactory + ); + destructor Destroy; override; // Modified function Execute(const RootNode: IAstNode): IAstNode; + // Updated static helper class function ExpandMacros( - const InitialScope: IExecutionScope; + const ARootRegistry: IMacroRegistry; // Added + const AInitialScope: IExecutionScope; const RootNode: IAstNode; const EvaluatorFactory: TEvaluatorFactory ): IAstNode; static; - - class property GlobalMacroRegistry: TMacroRegistry read FGlobalMacroRegistry; end; implementation @@ -109,40 +97,6 @@ uses Myc.Ast.Evaluator, // Required for TEvaluatorVisitor.Execute Myc.Data.Keyword; -{ TMacroRegistry } - -constructor TMacroExpander.TMacroRegistry.Create(AParent: TMacroRegistry); -begin - inherited Create; - FParent := AParent; - FMacros := TDictionary.Create; -end; - -destructor TMacroExpander.TMacroRegistry.Destroy; -begin - FMacros.Free; - inherited Destroy; -end; - -procedure TMacroExpander.TMacroRegistry.Define(const Node: IMacroDefinitionNode); -begin - FMacros.AddOrSetValue(Node.Name.Name, Node); -end; - -function TMacroExpander.TMacroRegistry.Find(const Name: string): IMacroDefinitionNode; -var - current: TMacroRegistry; -begin - current := Self; - while Assigned(current) do - begin - if current.FMacros.TryGetValue(Name, Result) then - exit; - current := current.FParent; - end; - Result := nil; -end; - { TExpansionVisitor } constructor TExpansionVisitor.Create(const AMacroScope: IExecutionScope; const AEvaluate: TEvaluateProc); @@ -288,57 +242,52 @@ end; { TMacroExpander } -constructor TMacroExpander.Create(const AInitialScope: IExecutionScope; const AEvaluatorFactory: TEvaluatorFactory); +constructor TMacroExpander.Create( + const ARootRegistry: IMacroRegistry; + const AInitialScope: IExecutionScope; + const AEvaluatorFactory: TEvaluatorFactory +); begin inherited Create; + Assert(Assigned(ARootRegistry)); Assert(Assigned(AInitialScope)); Assert(Assigned(AEvaluatorFactory)); + FInitialScope := AInitialScope; FEvaluatorFactory := AEvaluatorFactory; - // Erzeugt die Root-Registry für Makros - FCurrentMacroRegistry := TMacroRegistry.Create(FGlobalMacroRegistry); -end; - -class constructor TMacroExpander.CreateClass; -begin - FGlobalMacroRegistry := TMacroRegistry.Create(nil); + // Creates the root registry for this specific compilation run, + // parented to the global registry from the environment. + FCurrentMacroRegistry := ARootRegistry.CreateChildRegistry; end; destructor TMacroExpander.Destroy; begin - FCurrentMacroRegistry.Free; + // FCurrentMacroRegistry is an interface, managed by ARC inherited Destroy; end; -class destructor TMacroExpander.DestroyClass; -begin - FGlobalMacroRegistry.Free; -end; - procedure TMacroExpander.EnterMacroScope; begin - // Erstellt eine neue Registry mit der aktuellen als Parent - FCurrentMacroRegistry := TMacroRegistry.Create(FCurrentMacroRegistry); + // Creates a new registry with the current as Parent + FCurrentMacroRegistry := FCurrentMacroRegistry.CreateChildRegistry; end; procedure TMacroExpander.ExitMacroScope; -var - oldRegistry: TMacroRegistry; begin - oldRegistry := FCurrentMacroRegistry; - FCurrentMacroRegistry := oldRegistry.FParent; - oldRegistry.Free; + // Revert to parent registry. ARC will free the old child. + FCurrentMacroRegistry := FCurrentMacroRegistry.Parent; end; class function TMacroExpander.ExpandMacros( - const InitialScope: IExecutionScope; + const ARootRegistry: IMacroRegistry; + const AInitialScope: IExecutionScope; const RootNode: IAstNode; const EvaluatorFactory: TEvaluatorFactory ): IAstNode; begin - // IAstMacroExpander.Execute gibt keinen Descriptor mehr zurück - var expander := TMacroExpander.Create(InitialScope, EvaluatorFactory) as IAstMacroExpander; + // IAstMacroExpander.Execute gibt keinen Descriptor mehr zurueck + var expander := TMacroExpander.Create(ARootRegistry, AInitialScope, EvaluatorFactory) as IAstMacroExpander; Result := expander.Execute(RootNode); end; @@ -400,7 +349,7 @@ begin // --- It is a macro, expand it --- // 1. Create the temporary scope for the macro parameters - // It must be parented to the *initial* scope to find other macros/globals. + // It must be parented to the *initial* scope to find other globals. var expansionScope := TAst.CreateScope(FInitialScope); var params := macroDef.Parameters; if Length(Node.Arguments) <> Length(params) then @@ -422,8 +371,8 @@ begin boundSubAst: IAstNode; begin // This is the compile-time evaluation (Binder + Evaluator) - // Es wird der 'expansionScope' verwendet, der die AST-Argumente enthält - boundSubAst := TAstBinder.Bind(expansionScope, ANodeToEvaluate, subDescriptor); + // Es wird der 'expansionScope' verwendet, der die AST-Argumente enthaelt + boundSubAst := TAstBinder.Bind(expansionScope.CreateDescriptor, ANodeToEvaluate, subDescriptor); // Create eval scope from the new descriptor, parented to the expansion scope evalScope := subDescriptor.CreateScope(expansionScope); diff --git a/Src/AST/Myc.Ast.Environment.pas b/Src/AST/Myc.Ast.Environment.pas new file mode 100644 index 0000000..fe4fafb --- /dev/null +++ b/Src/AST/Myc.Ast.Environment.pas @@ -0,0 +1,419 @@ +unit Myc.Ast.Environment; + +interface + +uses + System.SysUtils, + System.Classes, + System.Generics.Collections, + Myc.Data.Value, + Myc.Ast, + Myc.Ast.Nodes, + Myc.Ast.Scope; + +type + IMacroRegistry = interface; // Forward + IEnvironment = interface; // Forward + IExecutionStrategy = interface; // Forward + IExecutable = interface; // Forward + + // Defines the Strategy for creating an Evaluator. + IExecutionStrategy = interface + function CreateVisitor(const AScope: IExecutionScope): IEvaluatorVisitor; + end; + + // Defines the compile-time macro storage. + IMacroRegistry = interface + {$region 'private'} + function GetParent: IMacroRegistry; + {$endregion} + + procedure Define(const Node: IMacroDefinitionNode); + function Find(const Name: string): IMacroDefinitionNode; + function CreateChildRegistry: IMacroRegistry; + property Parent: IMacroRegistry read GetParent; + end; + + // Represents a compiled, ready-to-run script. + // This encapsulates the compiled AST and its internal layout (Descriptor). + IExecutable = interface + {$region 'private'} + function GetCompiledAst: IAstNode; + function GetDescriptor: IScopeDescriptor; + {$endregion} + + // The final, compiled AST (for debugging, serialization, etc.) + property CompiledAst: IAstNode read GetCompiledAst; + // The internal layout (hidden from TForm1, used by IEnvironment.Execute) + property Descriptor: IScopeDescriptor read GetDescriptor; + end; + + // Defines the central environment for compilation and execution. + IEnvironment = interface + {$region 'private'} + function GetRootScope: IExecutionScope; + function GetMacroRegistry: IMacroRegistry; + {$endregion} + + procedure SetExecutionStrategy(const AStrategy: IExecutionStrategy); + + // Compiles source AST into a runnable script. + function Compile(const ANode: IAstNode): IExecutable; // Changed return type + + // Executes a previously compiled script. + function Execute(const AScript: IExecutable): TDataValue; + + function CreateEnvironment: IEnvironment; + + property RootScope: IExecutionScope read GetRootScope; + property MacroRegistry: IMacroRegistry read GetMacroRegistry; + end; + + // Interface Helper for IEnvironment + TAstEnvironment = record + private + FEnvironment: IEnvironment; + function GetRootScope: IExecutionScope; inline; + function GetMacroRegistry: IMacroRegistry; inline; + public + constructor Create(const AEnvironment: IEnvironment); + + class operator Initialize(out Dest: TAstEnvironment); + class operator Implicit(const A: IEnvironment): TAstEnvironment; + class operator Implicit(const A: TAstEnvironment): IEnvironment; + + function CreateEnvironment: TAstEnvironment; + + procedure SetStandardMode; + procedure SetDebugMode(ALog: TStrings; AShowScope: Boolean); + + function Compile(const ANode: IAstNode): IExecutable; + function Execute(const AScript: IExecutable): TDataValue; + + function CompileAndExecute(const AScript: IAstNode): TDataValue; + + procedure Define(const Name: String; const AScript: IAstNode); + + property RootScope: IExecutionScope read GetRootScope; + property MacroRegistry: IMacroRegistry read GetMacroRegistry; + end; + +implementation + +uses + Myc.Ast.RTL, + Myc.Ast.Evaluator, + Myc.Ast.Debugger, + Myc.Ast.Compiler.Macros, + Myc.Ast.Compiler.Binder, + Myc.Ast.Compiler.TypeChecker, + Myc.Ast.Compiler.Lowering, + Myc.Ast.Compiler.TCO; + +type + { TStandardExecutionStrategy } + TStandardExecutionStrategy = class(TInterfacedObject, IExecutionStrategy) + public + function CreateVisitor(const AScope: IExecutionScope): IEvaluatorVisitor; + end; + + { TDebugExecutionStrategy } + TDebugExecutionStrategy = class(TInterfacedObject, IExecutionStrategy) + private + FLog: TStrings; + FShowScope: Boolean; + public + constructor Create(ALog: TStrings; AShowScope: Boolean); + function CreateVisitor(const AScope: IExecutionScope): IEvaluatorVisitor; + end; + + { TMacroRegistryImpl } + TMacroRegistryImpl = class(TInterfacedObject, IMacroRegistry) + private + FParent: IMacroRegistry; + FMacros: TDictionary; + function GetParent: IMacroRegistry; + public + constructor Create(AParent: IMacroRegistry); + destructor Destroy; override; + procedure Define(const Node: IMacroDefinitionNode); + function Find(const Name: string): IMacroDefinitionNode; + function CreateChildRegistry: IMacroRegistry; + end; + + { TExecutable } + TExecutable = class(TInterfacedObject, IExecutable) + private + FCompiledAst: IAstNode; + FDescriptor: IScopeDescriptor; + function GetCompiledAst: IAstNode; + function GetDescriptor: IScopeDescriptor; + public + constructor Create(ACompiledAst: IAstNode; ADescriptor: IScopeDescriptor); + end; + + { TEnvironment } + TEnvironment = class(TInterfacedObject, IEnvironment) + private + FRootScope: IExecutionScope; + FMacroRegistry: IMacroRegistry; + FExecutionStrategy: IExecutionStrategy; + function GetRootScope: IExecutionScope; + function GetMacroRegistry: IMacroRegistry; + public + constructor Create( + const ARootScope: IExecutionScope; + const AMacroRegistry: IMacroRegistry; + const AExecutionStrategy: IExecutionStrategy + ); + destructor Destroy; override; + + function CreateEnvironment: IEnvironment; + + procedure SetExecutionStrategy(const AStrategy: IExecutionStrategy); + + function Compile(const ANode: IAstNode): IExecutable; + function Execute(const AScript: IExecutable): TDataValue; + end; + +// --- Factory Implementations --- + +{ TAstEnvironment } + +class operator TAstEnvironment.Initialize(out Dest: TAstEnvironment); +begin + Dest.FEnvironment := + TEnvironment.Create(TScope.CreateScope(nil, nil, nil), TMacroRegistryImpl.Create(nil), TStandardExecutionStrategy.Create); +end; + +constructor TAstEnvironment.Create(const AEnvironment: IEnvironment); +begin + FEnvironment := AEnvironment; +end; + +procedure TAstEnvironment.SetStandardMode; +begin + FEnvironment.SetExecutionStrategy(TStandardExecutionStrategy.Create); +end; + +procedure TAstEnvironment.SetDebugMode(ALog: TStrings; AShowScope: Boolean); +begin + FEnvironment.SetExecutionStrategy(TDebugExecutionStrategy.Create(ALog, AShowScope)); +end; + +class operator TAstEnvironment.Implicit(const A: IEnvironment): TAstEnvironment; +begin + Result.FEnvironment := A; +end; + +class operator TAstEnvironment.Implicit(const A: TAstEnvironment): IEnvironment; +begin + Result := A.FEnvironment; +end; + +function TAstEnvironment.Compile(const ANode: IAstNode): IExecutable; +begin + Result := FEnvironment.Compile(ANode); +end; + +function TAstEnvironment.CompileAndExecute(const AScript: IAstNode): TDataValue; +begin + Result := Execute(Compile(AScript)); +end; + +function TAstEnvironment.CreateEnvironment: TAstEnvironment; +begin + Result := FEnvironment.CreateEnvironment; +end; + +procedure TAstEnvironment.Define(const Name: String; const AScript: IAstNode); +begin + RootScope.Define(Name, CompileAndExecute(AScript)); +end; + +function TAstEnvironment.Execute(const AScript: IExecutable): TDataValue; +begin + Result := FEnvironment.Execute(AScript); +end; + +function TAstEnvironment.GetRootScope: IExecutionScope; +begin + Result := FEnvironment.GetRootScope; +end; + +function TAstEnvironment.GetMacroRegistry: IMacroRegistry; +begin + Result := FEnvironment.GetMacroRegistry; +end; + +{ TStandardExecutionStrategy } + +function TStandardExecutionStrategy.CreateVisitor(const AScope: IExecutionScope): IEvaluatorVisitor; +begin + Result := TEvaluatorVisitor.Create(AScope); +end; + +{ TDebugExecutionStrategy } + +constructor TDebugExecutionStrategy.Create(ALog: TStrings; AShowScope: Boolean); +begin + inherited Create; + FLog := ALog; + FShowScope := AShowScope; +end; + +function TDebugExecutionStrategy.CreateVisitor(const AScope: IExecutionScope): IEvaluatorVisitor; +begin + Result := TDebugEvaluatorVisitor.Create(AScope, FLog, FShowScope, 0); +end; + +{ TMacroRegistryImpl } + +constructor TMacroRegistryImpl.Create(AParent: IMacroRegistry); +begin + inherited Create; + FParent := AParent; + FMacros := TDictionary.Create; +end; + +destructor TMacroRegistryImpl.Destroy; +begin + FMacros.Free; + inherited Destroy; +end; + +function TMacroRegistryImpl.GetParent: IMacroRegistry; +begin + Result := FParent; +end; + +procedure TMacroRegistryImpl.Define(const Node: IMacroDefinitionNode); +begin + FMacros.AddOrSetValue(Node.Name.Name, Node); +end; + +function TMacroRegistryImpl.Find(const Name: string): IMacroDefinitionNode; +var + current: IMacroRegistry; +begin + current := Self; + while Assigned(current) do + begin + if (current as TMacroRegistryImpl).FMacros.TryGetValue(Name, Result) then + exit; + current := current.Parent; + end; + Result := nil; +end; + +function TMacroRegistryImpl.CreateChildRegistry: IMacroRegistry; +begin + Result := TMacroRegistryImpl.Create(Self); +end; + +{ TExecutable } + +constructor TExecutable.Create(ACompiledAst: IAstNode; ADescriptor: IScopeDescriptor); +begin + inherited Create; + FCompiledAst := ACompiledAst; + FDescriptor := ADescriptor; +end; + +function TExecutable.GetCompiledAst: IAstNode; +begin + Result := FCompiledAst; +end; + +function TExecutable.GetDescriptor: IScopeDescriptor; +begin + Result := FDescriptor; +end; + +{ TEnvironment } + +constructor TEnvironment.Create( + const ARootScope: IExecutionScope; + const AMacroRegistry: IMacroRegistry; + const AExecutionStrategy: IExecutionStrategy +); +begin + inherited Create; + FRootScope := ARootScope; + FMacroRegistry := AMacroRegistry; + FExecutionStrategy := AExecutionStrategy; +end; + +destructor TEnvironment.Destroy; +begin + inherited Destroy; +end; + +function TEnvironment.GetMacroRegistry: IMacroRegistry; +begin + Result := FMacroRegistry; +end; + +function TEnvironment.GetRootScope: IExecutionScope; +begin + Result := FRootScope; +end; + +procedure TEnvironment.SetExecutionStrategy(const AStrategy: IExecutionStrategy); +begin + FExecutionStrategy := AStrategy; +end; + +function TEnvironment.Compile(const ANode: IAstNode): IExecutable; +var + expandedAst, boundAst, typedAst, loweredAst: IAstNode; + descriptor: IScopeDescriptor; +begin + // Step 1: Expand macros + expandedAst := + TMacroExpander.ExpandMacros( + FMacroRegistry, + FRootScope, + ANode, + function(const Scope: IExecutionScope): IEvaluatorVisitor begin Result := FExecutionStrategy.CreateVisitor(Scope); end + ); + + // Step 2: Bind names + boundAst := TAstBinder.Bind(FRootScope.CreateDescriptor, expandedAst, descriptor); + + // Step 3: Check types + typedAst := TTypeChecker.CheckTypes(boundAst, descriptor); + + // Step 4: Lowering + loweredAst := TAstLowerer.Lower(typedAst); + + // Step 5: TCO + var compiledAst := TAstTCO.Optimize(loweredAst); + + // Step 6: Create the executable package + Result := TExecutable.Create(compiledAst, descriptor); +end; + +function TEnvironment.CreateEnvironment: IEnvironment; +begin + Result := TEnvironment.Create(TScope.CreateScope(FRootScope, nil, nil), TMacroRegistryImpl.Create(FMacroRegistry), FExecutionStrategy); +end; + +function TEnvironment.Execute(const AScript: IExecutable): TDataValue; +var + evalScope: IExecutionScope; + visitor: IEvaluatorVisitor; +begin + // 1. Create the runtime scope *directly from the descriptor*. + // This creates the raw scope with the correct slot count for local variables, + // parented to FRootScope. + evalScope := AScript.Descriptor.CreateScope(FRootScope); + + // 2. Use the strategy to create the final evaluator + visitor := FExecutionStrategy.CreateVisitor(evalScope); + + // 3. Execute the compiled AST + Result := visitor.Execute(AScript.CompiledAst); +end; + +end. diff --git a/Src/AST/Myc.Ast.Nodes.pas b/Src/AST/Myc.Ast.Nodes.pas index ead3af0..c8ae1f5 100644 --- a/Src/AST/Myc.Ast.Nodes.pas +++ b/Src/AST/Myc.Ast.Nodes.pas @@ -399,7 +399,7 @@ type function Execute(const RootNode: IAstNode): TDataValue; end; - // A factory for creating visitors, primarily used by the debugger subsystem. + // A factory for creating visitors TEvaluatorFactory = reference to function(const Scope: IExecutionScope): IEvaluatorVisitor; implementation diff --git a/Src/AST/Myc.Ast.RTL.pas b/Src/AST/Myc.Ast.RTL.pas index 67e4309..434bec3 100644 --- a/Src/AST/Myc.Ast.RTL.pas +++ b/Src/AST/Myc.Ast.RTL.pas @@ -10,6 +10,7 @@ uses Myc.Data.Scalar, Myc.Data.Value, Myc.Ast, + Myc.Ast.Scope, Myc.Ast.Nodes; type @@ -21,12 +22,13 @@ type constructor Create(const AName: string); end; +procedure RegisterRtlFunctions(const AScope: IExecutionScope); + implementation uses System.Rtti, System.TypInfo, - Myc.Ast.Scope, Myc.Ast.RTL.Core; //-------------------------------------------------------------------------------------------------- diff --git a/Src/AST/Myc.Ast.Scope.pas b/Src/AST/Myc.Ast.Scope.pas index 039b2ae..a9675a1 100644 --- a/Src/AST/Myc.Ast.Scope.pas +++ b/Src/AST/Myc.Ast.Scope.pas @@ -49,7 +49,8 @@ type procedure SetValues(const Address: TResolvedAddress; const Value: TDataValue); {$endregion} - procedure Define(const Name: string; const Value: TDataValue); + // Defines a symbol and returns its runtime address + function Define(const Name: string; const Value: TDataValue): TResolvedAddress; // Defines a variable at a given address and stores it directly in a shared cell (boxing). procedure DefineBoxed(SlotIndex: Integer; const Value: TDataValue); @@ -59,6 +60,8 @@ type function Capture(const Address: TResolvedAddress): IValueCell; function GetNameID(const Name: String): Integer; + // Resolves a name to an address by searching the runtime scope chain. + function Resolve(const Name: string): TResolvedAddress; function CreateDescriptor: IScopeDescriptor; @@ -143,8 +146,9 @@ type destructor Destroy; override; procedure Clear; function GetNameID(const Name: String): Integer; + function Resolve(const Name: string): TResolvedAddress; function Dump: string; - procedure Define(const Name: string; const Value: TDataValue); + function Define(const Name: string; const Value: TDataValue): TResolvedAddress; procedure DefineBoxed(SlotIndex: Integer; const Value: TDataValue); function Capture(const Address: TResolvedAddress): IValueCell; function CreateDescriptor: IScopeDescriptor; @@ -336,7 +340,7 @@ begin Result := TScopeDescriptor.CreateDescriptor(Self); end; -procedure TExecutionScope.Define(const Name: string; const Value: TDataValue); +function TExecutionScope.Define(const Name: string; const Value: TDataValue): TResolvedAddress; var id: Integer; index: Integer; @@ -351,6 +355,11 @@ begin FValues[index].Value := Value; FValues[index].IsBoxed := False; FNameToIndex.Add(id, index); + + // Return the address + Result.Kind := akLocalOrParent; + Result.ScopeDepth := 0; + Result.SlotIndex := index; end; procedure TExecutionScope.DefineBoxed(SlotIndex: Integer; const Value: TDataValue); @@ -480,6 +489,42 @@ begin end; end; +function TExecutionScope.Resolve(const Name: string): TResolvedAddress; +var + nameID: Integer; + slotIndex: Integer; + currentScope: IExecutionScope; + depth: Integer; +begin + currentScope := Self; + depth := 0; + // GetNameID is shared (or recreated) across the scope chain + nameID := GetNameID(Name); + + while Assigned(currentScope) do + begin + // We must cast to the implementation class to access 'NameToIndex' + var execScopeImpl := (currentScope as TExecutionScope); + + // Accessing .NameToIndex property ensures NeedNameToIndex is called + if execScopeImpl.NameToIndex.TryGetValue(nameID, slotIndex) then + begin + // Found in this scope + Result.Kind := akLocalOrParent; + Result.ScopeDepth := depth; + Result.SlotIndex := slotIndex; + exit; + end; + + // Not found, go to parent + inc(depth); + currentScope := currentScope.Parent; + end; + + // Not found in the entire chain + Result := Default(TResolvedAddress); // Kind = akUnresolved +end; + procedure TExecutionScope.SetValues(const Address: TResolvedAddress; const Value: TDataValue); var targetScope: TExecutionScope;