diff --git a/ASTPlayground/ASTPlayground.delphilsp.json b/ASTPlayground/ASTPlayground.delphilsp.json
index ba0e7b0..67bdd54 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.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.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.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": "Myc.Ast.Compiler.Specializer", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Specializer.pas" }, { "name": "Myc.Ast.Environment", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Environment.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Analysis.Purity", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Analysis.Purity.pas" }, { "name": "Myc.Ast.Identities", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Identities.pas" }, { "name": "Myc.Fmx.AstEditor.Visualizer", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Layout", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Layout.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Ast.Refactoring.Remove", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Refactoring.Remove.pas" }, { "name": "Myc.Fmx.AstEditor.Render", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Render.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Lists", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Primitives", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Control", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Data", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas" }, { "name": "Myc.Ast.RTL.TypeRegistry", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.TypeRegistry.pas" }, { "name": "Myc.Trade.Broker", "file": "file:///T%3A/Myc/Src/Myc.Trade.Broker.pas" }, { "name": "Myc.Data.Stream.Pipes", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.Pipes.pas" }, { "name": "Myc.Data.Stream", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Pipes", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Pipes.pas" }, { "name": "Demo.Finance", "file": "file:///T%3A/Myc/Test/Demo.Finance.pas" }, { "name": "Myc.Ast.Script.Print", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.Print.pas" }, { "name": "Myc.Ast.Json.Schema", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Json.Schema.pas" }, { "name": "Myc.Ast.Attributes", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Ast.Attributes.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.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.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.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": "Myc.Ast.Compiler.Specializer", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Specializer.pas" }, { "name": "Myc.Ast.Environment", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Environment.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Analysis.Purity", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Analysis.Purity.pas" }, { "name": "Myc.Ast.Identities", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Identities.pas" }, { "name": "Myc.Fmx.AstEditor.Visualizer", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Layout", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Layout.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Ast.Refactoring.Remove", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Refactoring.Remove.pas" }, { "name": "Myc.Fmx.AstEditor.Render", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Render.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Lists", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Primitives", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Control", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Data", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas" }, { "name": "Myc.Ast.RTL.TypeRegistry", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.TypeRegistry.pas" }, { "name": "Myc.Trade.Broker", "file": "file:///T%3A/Myc/Src/Myc.Trade.Broker.pas" }, { "name": "Myc.Data.Stream.Pipes", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.Pipes.pas" }, { "name": "Myc.Data.Stream", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Stream.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Pipes", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Pipes.pas" }, { "name": "Demo.Finance", "file": "file:///T%3A/Myc/Test/Demo.Finance.pas" }, { "name": "Myc.Ast.Script.Print", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.Print.pas" }, { "name": "Myc.Ast.Json.Schema.Old", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Json.Schema.Old.pas" }, { "name": "Myc.Ast.Attributes", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Ast.Attributes.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 21890c4..5947f79 100644
--- a/ASTPlayground/ASTPlayground.dpr
+++ b/ASTPlayground/ASTPlayground.dpr
@@ -43,8 +43,9 @@ uses
Myc.Fmx.AstEditor.Handlers.Pipes in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Pipes.pas',
Demo.Finance in '..\Test\Demo.Finance.pas',
Myc.Ast.Script.Print in '..\Src\AST\Myc.Ast.Script.Print.pas',
- Myc.Ast.Json.Schema in '..\Src\AST\Myc.Ast.Json.Schema.pas',
- Myc.Ast.Attributes in 'Myc.Ast.Attributes.pas';
+ Myc.Ast.Json.Schema.Old in '..\Src\AST\Myc.Ast.Json.Schema.Old.pas',
+ Myc.Ast.Attributes in 'Myc.Ast.Attributes.pas',
+ Myc.Ast.Json.Schema in '..\Src\AST\Myc.Ast.Json.Schema.pas';
{$R *.res}
diff --git a/ASTPlayground/ASTPlayground.dproj b/ASTPlayground/ASTPlayground.dproj
index 564b015..2744942 100644
--- a/ASTPlayground/ASTPlayground.dproj
+++ b/ASTPlayground/ASTPlayground.dproj
@@ -173,8 +173,9 @@
-
+
+
Base
diff --git a/ASTPlayground/MainForm.pas b/ASTPlayground/MainForm.pas
index 7b81972..0e4c679 100644
--- a/ASTPlayground/MainForm.pas
+++ b/ASTPlayground/MainForm.pas
@@ -288,7 +288,10 @@ begin
CompilerStageBox.BringToFront;
ClearButtonClick(Self);
- Memo1.Lines.Add(TAstSchema.GenerateFullSystemPrompt(FEnvironment.RootScope));
+ // Memo1.Lines.Add(TAstSchema.GenerateFullSystemPrompt(FEnvironment.RootScope));
+
+ // "Dieses JSON-Objekt betest du in das Feld response_schema (Gemini) oder json_schema (OpenAI) ein."
+ Memo1.Lines.Add(TAstSchema.GenerateFullSchema.ToJSON);
end;
procedure TForm1.ShowVizualization;
diff --git a/Src/AST/Myc.Ast.Attributes.pas b/Src/AST/Myc.Ast.Attributes.pas
index cf3a30a..4556b9b 100644
--- a/Src/AST/Myc.Ast.Attributes.pas
+++ b/Src/AST/Myc.Ast.Attributes.pas
@@ -8,12 +8,18 @@ uses
type
{ Defines the content type for the LLM schema generation. }
TFieldKind = (
- fkNode, // IAstNode (recursive structure)
- fkTuple, // ITupleNode (explicit ["Tuple", [...]] structure)
+ fkNode, // Node (recursive structure)
+ fkIdentifier, // Identifier ["Id", "name"]
+ fkKeyword, // Keyword literal ["Key", "name"]
+ fkLambda, // Lambda definition ["Fn", [...], body]
+ fkTuple, // Tuple (explicit ["Tuple", [...]] structure)
fkString, // Raw String (for identifiers/names)
fkValue, // TDataValue (primitive constants like number, string, boolean)
- fkNullableNode, // Optional Node (emits 'AstNode | null' in TypeScript)
- fkArrayOfPairs // Special structure for CondExpr: [[Cond, Branch], ...]
+ fkNullableNode, // Optional Node ('AstNode | null')
+ fkArrayOfNodes, // Raw Array of Nodes (used inside Tuple)
+ fkArrayOfPairs, // Special structure for CondExpr: [[Cond, Branch], ...]
+ fkArrayOfKeys, // Special structure for an array of keywords
+ fkPipeInputs // Specific structure: ["Tuple", [ ["Tuple", [Id, Tuple]], ... ]]
);
{ AstTagAttribute: Defines the JSON Tag for an AST Node. }
diff --git a/Src/AST/Myc.Ast.Json.Schema.Old.pas b/Src/AST/Myc.Ast.Json.Schema.Old.pas
new file mode 100644
index 0000000..be800db
--- /dev/null
+++ b/Src/AST/Myc.Ast.Json.Schema.Old.pas
@@ -0,0 +1,424 @@
+unit Myc.Ast.Json.Schema.Old;
+
+interface
+
+uses
+ system.sysutils,
+ system.classes,
+ system.generics.collections,
+ system.generics.defaults,
+ system.rtti,
+ system.typinfo,
+ system.json,
+ Myc.Data.Scalar,
+ Myc.Data.Value,
+ Myc.Ast.Nodes,
+ Myc.Ast.Attributes,
+ Myc.Ast.Scope,
+ Myc.Ast.Types,
+ Myc.Ast.Script,
+ Myc.Ast.Json,
+ Myc.Ast;
+
+type
+ { Scans AST, RTL and Scope metadata to generate a context-aware LLM system prompt. }
+ TAstSchema = class
+ strict private
+ type
+ TFieldInfo = record
+ Idx: Integer;
+ Name: string;
+ Kind: TFieldKind;
+ end;
+
+ class function GetTsType(Kind: TFieldKind): string; static;
+ class function TypeToTs(const AType: IStaticType): string; static;
+ public
+ // Generates the TypeScript definition for AST nodes using RTTI on the Node Interfaces
+ class function GenerateTypeScriptDefinition: string; static;
+
+ // Unified section: Lists symbols available in the given scope with their docs and types.
+ class function GenerateAvailableSymbols(const AScope: IExecutionScope): string; static;
+
+ // Generates documentation for the standard library by creating a temporary scope.
+ class function GenerateAllRtlDocumentation: string; static;
+
+ // Detailed generation rules for the LLM
+ class function GenerateGenerationRules: string; static;
+
+ // The final consolidated system prompt for the AI
+ class function GenerateFullSystemPrompt(const AScope: IExecutionScope = nil): string; static;
+ end;
+
+implementation
+
+{ TAstSchema }
+
+class function TAstSchema.GetTsType(Kind: TFieldKind): string;
+begin
+ case Kind of
+ fkNode: Result := 'AstNode';
+ fkTuple: Result := 'Tuple';
+ fkString: Result := 'string';
+ fkValue: Result := 'number | string | boolean';
+ fkNullableNode: Result := 'AstNode | null';
+ fkArrayOfPairs: Result := 'Array<[AstNode, AstNode]>';
+ else
+ Result := 'any';
+ end;
+end;
+
+class function TAstSchema.TypeToTs(const AType: IStaticType): string;
+begin
+ if not Assigned(AType) then
+ exit('any');
+
+ case AType.Kind of
+ stUnknown: Result := 'any';
+ stVoid: Result := 'void';
+ stOrdinal, stFloat: Result := 'number';
+ stBoolean: Result := 'boolean';
+ stDateTime: Result := 'datetime';
+ stText: Result := 'string';
+ stKeyword: Result := 'keyword';
+
+ stSeries: Result := Format('Series<%s>', [TypeToTs(AType.AsSeries.ElementType)]);
+
+ stRecord:
+ begin
+ var def := AType.AsRecord.Definition;
+ var fields := TList.Create;
+ try
+ for var i := 0 to def.Count - 1 do
+ begin
+ var k := def.Keywords[i].Name;
+ var tStr: string;
+ case def[i] of
+ TScalar.TKind.Ordinal, TScalar.TKind.Float: tStr := 'number';
+ TScalar.TKind.Boolean: tStr := 'boolean';
+ TScalar.TKind.DateTime: tStr := 'datetime';
+ TScalar.TKind.Keyword: tStr := 'keyword';
+ else
+ tStr := 'any';
+ end;
+ fields.Add(Format('%s: %s', [k, tStr]));
+ end;
+ Result := '{ ' + string.Join(', ', fields.ToArray) + ' }';
+ finally
+ fields.Free;
+ end;
+ end;
+
+ stGenericRecord:
+ begin
+ var def := AType.AsGenericRecord.GenericDefinition;
+ var fields := TList.Create;
+ try
+ for var i := 0 to def.Count - 1 do
+ fields.Add(Format('%s: %s', [def.Keywords[i].Name, TypeToTs(def[i])]));
+ Result := '{ ' + string.Join(', ', fields.ToArray) + ' }';
+ finally
+ fields.Free;
+ end;
+ end;
+
+ stRecordSeries: Result := 'Stream<' + TypeToTs(TTypes.CreateRecord(AType.AsRecord.Definition)) + '>';
+
+ stTuple:
+ begin
+ var elems := AType.AsTuple.Elements;
+ var elemStrings := TList.Create;
+ try
+ for var t in elems do
+ elemStrings.Add(TypeToTs(t));
+ Result := '[' + string.Join(', ', elemStrings.ToArray) + ']';
+ finally
+ elemStrings.Free;
+ end;
+ end;
+
+ stVector: Result := TypeToTs(AType.AsVector.ElementType) + '[]';
+
+ stMatrix:
+ begin
+ var dims := AType.AsMatrix.Dimensions;
+ Result := TypeToTs(AType.AsMatrix.ElementType);
+ for var k := 0 to High(dims) do
+ Result := Result + '[]';
+ end;
+
+ stMethod:
+ begin
+ var signatures := AType.AsMethod.Signatures;
+ if Length(signatures) = 0 then
+ exit('function');
+
+ var sigStrings := TList.Create;
+ try
+ for var sig in signatures do
+ begin
+ var args := TList.Create;
+ try
+ for var p in sig.ParamTypes do
+ args.Add(TypeToTs(p));
+
+ var s := Format('(%s) => %s', [string.Join(', ', args.ToArray), TypeToTs(sig.ReturnType)]);
+
+ // Deduplicate: If multiple RTL overloads map to the same TS signature, only show it once.
+ if not sigStrings.Contains(s) then
+ sigStrings.Add(s);
+ finally
+ args.Free;
+ end;
+ end;
+ Result := string.Join(' | ', sigStrings.ToArray);
+ finally
+ sigStrings.Free;
+ end;
+ end;
+ else
+ Result := 'any';
+ end;
+
+ if AType.IsOptional then
+ Result := Result + ' | null';
+end;
+
+class function TAstSchema.GenerateTypeScriptDefinition: string;
+var
+ ctx: TRttiContext;
+ typ: TRttiType;
+ attr: TCustomAttribute;
+ nodeDefs: TDictionary>;
+ nodeDocs: TDictionary;
+ nodeExamples: TDictionary>;
+ unionTypes: TList;
+ sb: TStringBuilder;
+ tag, doc: string;
+ fieldList: TList;
+ exampleList: TList;
+ jsonConv: IJsonAstConverter;
+ i: Integer;
+begin
+ ctx := TRttiContext.Create;
+ jsonConv := TJsonAstConverter.Create;
+ nodeDefs := TDictionary>.Create;
+ nodeDocs := TDictionary.Create;
+ nodeExamples := TDictionary>.Create;
+ unionTypes := TList.Create;
+ sb := TStringBuilder.Create;
+ try
+ for typ in ctx.GetTypes do
+ begin
+ if typ.TypeKind <> tkInterface then
+ continue;
+ tag := '';
+ doc := '';
+ fieldList := nil;
+ exampleList := nil;
+ for attr in typ.GetAttributes do
+ begin
+ if attr is AstTagAttribute then
+ tag := AstTagAttribute(attr).Tag;
+ if attr is AstDocAttribute then
+ doc := AstDocAttribute(attr).Description;
+ if attr is AstScriptExampleAttribute then
+ begin
+ if exampleList = nil then
+ exampleList := TList.Create;
+ try
+ // Parse example script to ensure valid JSON output in documentation
+ var node := TAstScript.Parse(AstScriptExampleAttribute(attr).Script);
+ var jsonVal := jsonConv.Serialize(node);
+ try
+ exampleList.Add(jsonVal.ToJSON);
+ finally
+ jsonVal.Free;
+ end;
+ except
+ on E: Exception do
+ exampleList.Add('/* Error in example: ' + E.Message + ' */');
+ end;
+ end;
+ if attr is AstFieldAttribute then
+ begin
+ if fieldList = nil then
+ fieldList := TList.Create;
+ var f: TFieldInfo;
+ f.Idx := AstFieldAttribute(attr).Index;
+ f.Name := AstFieldAttribute(attr).Name;
+ f.Kind := AstFieldAttribute(attr).Kind;
+ fieldList.Add(f);
+ end;
+ end;
+ if tag <> '' then
+ begin
+ unionTypes.Add(tag);
+ if doc <> '' then
+ nodeDocs.Add(tag, doc);
+ if exampleList <> nil then
+ nodeExamples.Add(tag, exampleList);
+ if fieldList = nil then
+ fieldList := TList.Create;
+ nodeDefs.Add(tag, fieldList);
+ end
+ else
+ begin
+ fieldList.Free;
+ exampleList.Free;
+ end;
+ end;
+ sb.AppendLine('// AST Schema Definition' + sLineBreak + '// Format: Compact JSON Arrays [Tag, Arg1, Arg2, ...]' + sLineBreak);
+ unionTypes.Sort;
+ sb.AppendLine('type AstNode = ');
+ for i := 0 to unionTypes.Count - 1 do
+ begin
+ sb.Append(' | ' + unionTypes[i]);
+ if i < unionTypes.Count - 1 then
+ sb.AppendLine;
+ end;
+ sb.AppendLine(
+ ';'
+ + sLineBreak
+ + sLineBreak
+ + '/** Explicit list structure */'
+ + sLineBreak
+ + 'type Tuple = ["Tuple", AstNode[]];'
+ + sLineBreak
+ );
+ for tag in unionTypes do
+ begin
+ if tag = 'Tuple' then
+ continue;
+ sb.Append('/** ');
+ if nodeDocs.TryGetValue(tag, doc) then
+ sb.Append(doc);
+ if nodeExamples.TryGetValue(tag, exampleList) then
+ for var ex in exampleList do
+ sb.Append(sLineBreak + ' @example ' + ex);
+ sb.AppendLine(' */');
+ fieldList := nodeDefs[tag];
+ fieldList.Sort(TComparer.Construct(function(const L, R: TFieldInfo): Integer begin Result := L.Idx - R.Idx; end));
+ sb.Append('type ' + tag + ' = ["' + tag + '"');
+ for var f in fieldList do
+ sb.Append(Format(', %s /* %s */', [GetTsType(f.Kind), f.Name]));
+ sb.AppendLine('];');
+ end;
+ Result := sb.ToString;
+ finally
+ for fieldList in nodeDefs.Values do
+ fieldList.Free;
+ for exampleList in nodeExamples.Values do
+ exampleList.Free;
+ nodeDefs.Free;
+ nodeDocs.Free;
+ nodeExamples.Free;
+ unionTypes.Free;
+ sb.Free;
+ ctx.Free;
+ end;
+end;
+
+class function TAstSchema.GenerateAvailableSymbols(const AScope: IExecutionScope): string;
+var
+ sb: TStringBuilder;
+ layout: IScopeLayout;
+ descriptor: IScopeDescriptor;
+ symbols: TArray;
+ name, doc: string;
+ typ: IStaticType;
+ slot: Integer;
+begin
+ if not Assigned(AScope) then
+ exit('');
+
+ sb := TStringBuilder.Create;
+ try
+ descriptor := AScope.Descriptor;
+ layout := descriptor.Layout;
+ symbols := layout.GetSymbols;
+ TArray.Sort(symbols);
+
+ sb.AppendLine('### Available Symbols (Environment & Library)');
+ sb.AppendLine('The following symbols are currently defined and can be used in your script:');
+ sb.AppendLine;
+
+ for name in symbols do
+ begin
+ // Filter internal compiler symbols
+ if name.StartsWith('<') or name.EndsWith('>') then
+ continue;
+
+ slot := layout.FindSlot(name);
+ typ := descriptor.GetSymbolType(slot);
+ doc := layout.GetSymbolDoc(name);
+
+ sb.Append(Format('- `%s`', [name]));
+
+ if (typ <> nil) then
+ sb.Append(': ' + TypeToTs(typ));
+
+ if doc <> '' then
+ sb.Append(' — ' + doc);
+
+ sb.AppendLine;
+ end;
+ Result := sb.ToString;
+ finally
+ sb.Free;
+ end;
+end;
+
+class function TAstSchema.GenerateAllRtlDocumentation: string;
+begin
+ // Create a temporary root scope.
+ // The True parameter triggers the registration of all standard libraries (RTL).
+ // This populates the scope with function definitions and their documentation strings.
+ var tempScope := TAst.CreateScope(nil, nil, True);
+ Result := GenerateAvailableSymbols(tempScope);
+end;
+
+class function TAstSchema.GenerateGenerationRules: string;
+begin
+ Result :=
+ '''
+ **CRITICAL GENERATION RULES:**
+
+ 1. **NO JSON OBJECTS:** Do not use `{}`. Every node MUST be a JSON Array `["Tag", Arg1, Arg2]`.
+ 2. **EXPLICIT TUPLES:** Fields defined as `Tuple` MUST be wrapped in `["Tuple", [...]]`.
+ 3. **EXPLICIT NULLS:** Optional fields (`| null`) MUST be explicit `null` if not present.
+ 4. **STRICT ORDER:** Array elements must follow the schema index exactly.
+ 5. **OPERATORS:** Use `Call` with an `Id` for operators: `["Call", ["Id", "+"], ["Tuple", [["Const", 1], ["Const", 2]]]]`.
+ 6. **ID VS KEY:** Use `Key` for record keys. Use `Id` for variables, functions, and operators.
+ 7. **BOOLEANS:** The literals `true` and `false` are identifiers: `["Id", "true"]` or `["Id", "false"]`.
+ 8. **SCALAR TYPES:** Valid types for series definitions are: `:Ordinal`, `:Float`, `:Boolean`, `:Text`, `:DateTime`.
+ 9. **NESTED ARRAYS:** In "Cond", the pairs are an array of arrays: `[ [cond1, branch1], [cond2, branch2] ]`.
+ 10. **RECURSION:** Use `Recur` for tail-recursive calls to enable optimization.
+ 11. **NO COMMENTS:** Output raw JSON only.
+ ''';
+end;
+
+class function TAstSchema.GenerateFullSystemPrompt(const AScope: IExecutionScope): string;
+begin
+ Result :=
+ '''
+ You are a compiler frontend for a domain-specific scripting language.
+ Your task is to generate a valid Abstract Syntax Tree (AST) in a specific Compact JSON format.
+
+ ### AST Schema (TypeScript Definition)
+ '''
+ + sLineBreak
+ + GenerateTypeScriptDefinition
+ + sLineBreak
+ + '### Constraints & Rules'
+ + sLineBreak
+ + GenerateGenerationRules
+ + sLineBreak;
+
+ if Assigned(AScope) then
+ Result := Result + GenerateAvailableSymbols(AScope)
+ else
+ Result := Result + GenerateAllRtlDocumentation;
+end;
+
+end.
diff --git a/Src/AST/Myc.Ast.Json.Schema.pas b/Src/AST/Myc.Ast.Json.Schema.pas
index 5b7b551..6a031dc 100644
--- a/Src/AST/Myc.Ast.Json.Schema.pas
+++ b/Src/AST/Myc.Ast.Json.Schema.pas
@@ -1,4 +1,4 @@
-unit Myc.Ast.Json.Schema;
+unit Myc.Ast.Json.Schema;
interface
@@ -8,417 +8,222 @@ uses
system.generics.collections,
system.generics.defaults,
system.rtti,
- system.typinfo,
system.json,
- Myc.Data.Scalar,
- Myc.Data.Value,
Myc.Ast.Nodes,
Myc.Ast.Attributes,
- Myc.Ast.Scope,
Myc.Ast.Types,
- Myc.Ast.Script,
- Myc.Ast.Json,
Myc.Ast;
type
- { Scans AST, RTL and Scope metadata to generate a context-aware LLM system prompt. }
+ { Generates JSON schema for Structured Output based on AST RTTI. }
TAstSchema = class
- strict private
- type
- TFieldInfo = record
- Idx: Integer;
- Name: string;
- Kind: TFieldKind;
- end;
-
- class function GetTsType(Kind: TFieldKind): string; static;
- class function TypeToTs(const AType: IStaticType): string; static;
+ private
+ class function GetJsonType(Kind: TFieldKind): TJSONObject; static;
public
- // Generates the TypeScript definition for AST nodes using RTTI on the Node Interfaces
- class function GenerateTypeScriptDefinition: string; static;
-
- // Unified section: Lists symbols available in the given scope with their docs and types.
- class function GenerateAvailableSymbols(const AScope: IExecutionScope): string; static;
-
- // Generates documentation for the standard library by creating a temporary scope.
- class function GenerateAllRtlDocumentation: string; static;
-
- // Detailed generation rules for the LLM
- class function GenerateGenerationRules: string; static;
-
- // The final consolidated system prompt for the AI
- class function GenerateFullSystemPrompt(const AScope: IExecutionScope = nil): string; static;
+ { Generates a complete JSON schema for LLM structured output APIs. }
+ class function GenerateFullSchema: TJSONObject; static;
end;
implementation
{ TAstSchema }
-class function TAstSchema.GetTsType(Kind: TFieldKind): string;
+class function TAstSchema.GetJsonType(Kind: TFieldKind): TJSONObject;
+ {$region 'helpers'}
+ function JRef(const APath: string): TJSONObject;
+ begin
+ Result := TJSONObject.Create;
+ Result.AddPair('$ref', APath);
+ end;
+
+ function JDefRef(const ATag: string): TJSONObject;
+ begin
+ Result := JRef('#/$defs/' + ATag);
+ end;
+
+ function JType(const ATypeName: string): TJSONObject;
+ begin
+ Result := TJSONObject.Create;
+ Result.AddPair('type', ATypeName);
+ end;
+
+ function JConst(const AVal: string): TJSONObject;
+ begin
+ Result := TJSONObject.Create;
+ Result.AddPair('const', AVal);
+ end;
+
+ function JArray(AItems: TJSONValue): TJSONObject;
+ begin
+ Result := JType('array');
+ Result.AddPair('items', AItems);
+ end;
+
+ // Combined function: Creates array from items and sets prefixItems + limits
+ function JFixedArray(const AItems: array of TJSONValue): TJSONObject;
+ var
+ arr: TJSONArray;
+ item: TJSONValue;
+ count: Integer;
+ begin
+ Result := JType('array');
+
+ arr := TJSONArray.Create;
+ for item in AItems do
+ arr.AddElement(item);
+
+ count := arr.Count;
+ Result.AddPair('prefixItems', arr);
+ Result.AddPair('minItems', TJSONNumber.Create(count));
+ Result.AddPair('maxItems', TJSONNumber.Create(count));
+ end;
+
+ function JTuple(AItems: TJSONValue): TJSONObject;
+ begin
+ Result := JFixedArray([JConst('Tuple'), AItems]);
+ end;
+
+ function JAnyOf(AOptions: array of TJSONValue): TJSONObject;
+ var
+ arr: TJSONArray;
+ opt: TJSONValue;
+ begin
+ arr := TJSONArray.Create;
+ for opt in AOptions do
+ arr.AddElement(opt);
+ Result := TJSONObject.Create;
+ Result.AddPair('anyOf', arr);
+ end;
+{$endregion}
+
+var
+ pair, selItems, selTuple, entryContent, entryNode: TJSONObject;
begin
case Kind of
- fkNode: Result := 'AstNode';
- fkTuple: Result := 'Tuple';
- fkString: Result := 'string';
- fkValue: Result := 'number | string | boolean';
- fkNullableNode: Result := 'AstNode | null';
- fkArrayOfPairs: Result := 'Array<[AstNode, AstNode]>';
+ fkNode: Result := JDefRef('Node');
+ fkTuple: Result := JDefRef('Tuple');
+ fkKeyword: Result := JDefRef('Key');
+ fkLambda: Result := JDefRef('Fn');
+ fkIdentifier: Result := JDefRef('Id');
+ fkString: Result := JType('string');
+ fkValue: Result := JAnyOf([JType('number'), JType('string'), JType('boolean')]);
+ fkNullableNode: Result := JAnyOf([JDefRef('Node'), JType('null')]);
+ fkArrayOfNodes: Result := JArray(JDefRef('Node'));
+
+ fkArrayOfPairs:
+ begin
+ // [[Cond, Branch], ...]
+ pair := JFixedArray([JDefRef('Node'), JDefRef('Node')]);
+ Result := JArray(pair);
+ end;
+
+ fkPipeInputs:
+ begin
+ // 1. Selector Tuple: ["Tuple", [Key, ...]]
+ selTuple := JTuple(JArray(JDefRef('Key')));
+
+ // 2. Entry Node: ["Tuple", [Id, SelectorTuple]]
+ entryNode := JTuple(JFixedArray([JDefRef('Id'), selTuple]));
+
+ // 3. Outer Inputs List: ["Tuple", [EntryNode, ...]]
+ Result := JTuple(JArray(entryNode));
+ end;
else
- Result := 'any';
+ Result := TJSONObject.Create;
end;
end;
-class function TAstSchema.TypeToTs(const AType: IStaticType): string;
-begin
- if not Assigned(AType) then
- exit('any');
-
- case AType.Kind of
- stUnknown: Result := 'any';
- stVoid: Result := 'void';
- stOrdinal, stFloat: Result := 'number';
- stBoolean: Result := 'boolean';
- stDateTime: Result := 'datetime';
- stText: Result := 'string';
- stKeyword: Result := 'keyword';
-
- stSeries: Result := Format('Series<%s>', [TypeToTs(AType.AsSeries.ElementType)]);
-
- stRecord:
- begin
- var def := AType.AsRecord.Definition;
- var fields := TList.Create;
- try
- for var i := 0 to def.Count - 1 do
- begin
- var k := def.Keywords[i].Name;
- var tStr: string;
- case def[i] of
- TScalar.TKind.Ordinal, TScalar.TKind.Float: tStr := 'number';
- TScalar.TKind.Boolean: tStr := 'boolean';
- TScalar.TKind.DateTime: tStr := 'datetime';
- TScalar.TKind.Keyword: tStr := 'keyword';
- else
- tStr := 'any';
- end;
- fields.Add(Format('%s: %s', [k, tStr]));
- end;
- Result := '{ ' + string.Join(', ', fields.ToArray) + ' }';
- finally
- fields.Free;
- end;
- end;
-
- stGenericRecord:
- begin
- var def := AType.AsGenericRecord.GenericDefinition;
- var fields := TList.Create;
- try
- for var i := 0 to def.Count - 1 do
- fields.Add(Format('%s: %s', [def.Keywords[i].Name, TypeToTs(def[i])]));
- Result := '{ ' + string.Join(', ', fields.ToArray) + ' }';
- finally
- fields.Free;
- end;
- end;
-
- stRecordSeries: Result := 'Stream<' + TypeToTs(TTypes.CreateRecord(AType.AsRecord.Definition)) + '>';
-
- stTuple:
- begin
- var elems := AType.AsTuple.Elements;
- var elemStrings := TList.Create;
- try
- for var t in elems do
- elemStrings.Add(TypeToTs(t));
- Result := '[' + string.Join(', ', elemStrings.ToArray) + ']';
- finally
- elemStrings.Free;
- end;
- end;
-
- stVector: Result := TypeToTs(AType.AsVector.ElementType) + '[]';
-
- stMatrix:
- begin
- var dims := AType.AsMatrix.Dimensions;
- Result := TypeToTs(AType.AsMatrix.ElementType);
- for var k := 0 to High(dims) do
- Result := Result + '[]';
- end;
-
- stMethod:
- begin
- var signatures := AType.AsMethod.Signatures;
- if Length(signatures) = 0 then
- exit('function');
-
- var sigStrings := TList.Create;
- try
- for var sig in signatures do
- begin
- var args := TList.Create;
- try
- for var p in sig.ParamTypes do
- args.Add(TypeToTs(p));
-
- var s := Format('(%s) => %s', [string.Join(', ', args.ToArray), TypeToTs(sig.ReturnType)]);
-
- // Deduplicate: If multiple RTL overloads map to the same TS signature, only show it once.
- if not sigStrings.Contains(s) then
- sigStrings.Add(s);
- finally
- args.Free;
- end;
- end;
- Result := string.Join(' | ', sigStrings.ToArray);
- finally
- sigStrings.Free;
- end;
- end;
- else
- Result := 'any';
- end;
-
- if AType.IsOptional then
- Result := Result + ' | null';
-end;
-
-class function TAstSchema.GenerateTypeScriptDefinition: string;
+class function TAstSchema.GenerateFullSchema: TJSONObject;
var
ctx: TRttiContext;
typ: TRttiType;
attr: TCustomAttribute;
- nodeDefs: TDictionary>;
- nodeDocs: TDictionary;
- nodeExamples: TDictionary>;
- unionTypes: TList;
- sb: TStringBuilder;
- tag, doc: string;
- fieldList: TList;
- exampleList: TList;
- jsonConv: IJsonAstConverter;
- i: Integer;
+ defs, nodeDef, astNodeRef: TJSONObject;
+ anyOfNodes: TJSONArray;
+ tag: string;
+ fields: TList;
+ minCount, maxCount: Integer;
begin
ctx := TRttiContext.Create;
- jsonConv := TJsonAstConverter.Create;
- nodeDefs := TDictionary>.Create;
- nodeDocs := TDictionary.Create;
- nodeExamples := TDictionary>.Create;
- unionTypes := TList.Create;
- sb := TStringBuilder.Create;
+ Result := TJSONObject.Create;
+ defs := TJSONObject.Create;
+ anyOfNodes := TJSONArray.Create;
+
try
+ // 1. Scan all interfaces for AstTag metadata
for typ in ctx.GetTypes do
begin
if typ.TypeKind <> tkInterface then
continue;
+
tag := '';
- doc := '';
- fieldList := nil;
- exampleList := nil;
- for attr in typ.GetAttributes do
- begin
- if attr is AstTagAttribute then
- tag := AstTagAttribute(attr).Tag;
- if attr is AstDocAttribute then
- doc := AstDocAttribute(attr).Description;
- if attr is AstScriptExampleAttribute then
+ fields := TList.Create;
+ try
+ for attr in typ.GetAttributes do
begin
- if exampleList = nil then
- exampleList := TList.Create;
- try
- // Parse example script to ensure valid JSON output in documentation
- var node := TAstScript.Parse(AstScriptExampleAttribute(attr).Script);
- var jsonVal := jsonConv.Serialize(node);
- try
- exampleList.Add(jsonVal.ToJSON);
- finally
- jsonVal.Free;
- end;
- except
- on E: Exception do
- exampleList.Add('/* Error in example: ' + E.Message + ' */');
- end;
+ if attr is AstTagAttribute then
+ tag := AstTagAttribute(attr).Tag;
+ if attr is AstFieldAttribute then
+ fields.Add(AstFieldAttribute(attr));
end;
- if attr is AstFieldAttribute then
+
+ if tag = '' then
+ continue;
+
+ // Sort fields by index
+ fields.Sort(
+ TComparer
+ .Construct(function(const L, R: AstFieldAttribute): Integer begin Result := L.Index - R.Index; end)
+ );
+
+ nodeDef := TJSONObject.Create;
+ nodeDef.AddPair('type', 'array');
+
+ var items := TJSONArray.Create;
+ items.AddElement(TJSONObject.Create.AddPair('const', tag));
+
+ minCount := 1;
+ maxCount := 1;
+
+ for var f in fields do
begin
- if fieldList = nil then
- fieldList := TList.Create;
- var f: TFieldInfo;
- f.Idx := AstFieldAttribute(attr).Index;
- f.Name := AstFieldAttribute(attr).Name;
- f.Kind := AstFieldAttribute(attr).Kind;
- fieldList.Add(f);
+ inc(maxCount);
+ // Only non-nullable fields increase minCount
+ if f.Kind <> fkNullableNode then
+ minCount := maxCount;
+
+ items.AddElement(GetJsonType(f.Kind));
end;
- end;
- if tag <> '' then
- begin
- unionTypes.Add(tag);
- if doc <> '' then
- nodeDocs.Add(tag, doc);
- if exampleList <> nil then
- nodeExamples.Add(tag, exampleList);
- if fieldList = nil then
- fieldList := TList.Create;
- nodeDefs.Add(tag, fieldList);
- end
- else
- begin
- fieldList.Free;
- exampleList.Free;
+
+ nodeDef.AddPair('prefixItems', items);
+ nodeDef.AddPair('minItems', TJSONNumber.Create(minCount));
+ nodeDef.AddPair('maxItems', TJSONNumber.Create(maxCount));
+ // additionalItems removed as maxItems guarantees strictness
+
+ defs.AddPair(tag, nodeDef);
+
+ // Add reference to the global AstNode union
+ astNodeRef := TJSONObject.Create;
+ astNodeRef.AddPair('$ref', '#/$defs/' + tag);
+ anyOfNodes.AddElement(astNodeRef);
+
+ finally
+ fields.Free;
end;
end;
- sb.AppendLine('// AST Schema Definition' + sLineBreak + '// Format: Compact JSON Arrays [Tag, Arg1, Arg2, ...]' + sLineBreak);
- unionTypes.Sort;
- sb.AppendLine('type AstNode = ');
- for i := 0 to unionTypes.Count - 1 do
- begin
- sb.Append(' | ' + unionTypes[i]);
- if i < unionTypes.Count - 1 then
- sb.AppendLine;
- end;
- sb.AppendLine(
- ';'
- + sLineBreak
- + sLineBreak
- + '/** Explicit list structure */'
- + sLineBreak
- + 'type Tuple = ["Tuple", AstNode[]];'
- + sLineBreak
- );
- for tag in unionTypes do
- begin
- if tag = 'Tuple' then
- continue;
- sb.Append('/** ');
- if nodeDocs.TryGetValue(tag, doc) then
- sb.Append(doc);
- if nodeExamples.TryGetValue(tag, exampleList) then
- for var ex in exampleList do
- sb.Append(sLineBreak + ' @example ' + ex);
- sb.AppendLine(' */');
- fieldList := nodeDefs[tag];
- fieldList.Sort(TComparer.Construct(function(const L, R: TFieldInfo): Integer begin Result := L.Idx - R.Idx; end));
- sb.Append('type ' + tag + ' = ["' + tag + '"');
- for var f in fieldList do
- sb.Append(Format(', %s /* %s */', [GetTsType(f.Kind), f.Name]));
- sb.AppendLine('];');
- end;
- Result := sb.ToString;
+
+ // 2. Define the base AstNode anyOf union
+ var astNodeBase := TJSONObject.Create;
+ astNodeBase.AddPair('anyOf', anyOfNodes);
+ defs.AddPair('Node', astNodeBase);
+
+ // 3. Assemble final Root Object
+ Result.AddPair('$ref', '#/$defs/Node');
+ Result.AddPair('$defs', defs);
+
finally
- for fieldList in nodeDefs.Values do
- fieldList.Free;
- for exampleList in nodeExamples.Values do
- exampleList.Free;
- nodeDefs.Free;
- nodeDocs.Free;
- nodeExamples.Free;
- unionTypes.Free;
- sb.Free;
ctx.Free;
end;
end;
-class function TAstSchema.GenerateAvailableSymbols(const AScope: IExecutionScope): string;
-var
- sb: TStringBuilder;
- layout: IScopeLayout;
- descriptor: IScopeDescriptor;
- symbols: TArray;
- name, doc: string;
- typ: IStaticType;
- slot: Integer;
-begin
- if not Assigned(AScope) then
- exit('');
-
- sb := TStringBuilder.Create;
- try
- descriptor := AScope.Descriptor;
- layout := descriptor.Layout;
- symbols := layout.GetSymbols;
- TArray.Sort(symbols);
-
- sb.AppendLine('### Available Symbols (Environment & Library)');
- sb.AppendLine('The following symbols are currently defined and can be used in your script:');
- sb.AppendLine;
-
- for name in symbols do
- begin
- // Filter internal compiler symbols
- if name.StartsWith('<') or name.EndsWith('>') then
- continue;
-
- slot := layout.FindSlot(name);
- typ := descriptor.GetSymbolType(slot);
- doc := layout.GetSymbolDoc(name);
-
- sb.Append(Format('- `%s`', [name]));
-
- if (typ <> nil) then
- sb.Append(': ' + TypeToTs(typ));
-
- if doc <> '' then
- sb.Append(' — ' + doc);
-
- sb.AppendLine;
- end;
- Result := sb.ToString;
- finally
- sb.Free;
- end;
-end;
-
-class function TAstSchema.GenerateAllRtlDocumentation: string;
-begin
- // Create a temporary root scope.
- // The True parameter triggers the registration of all standard libraries (RTL).
- // This populates the scope with function definitions and their documentation strings.
- var tempScope := TAst.CreateScope(nil, nil, True);
- Result := GenerateAvailableSymbols(tempScope);
-end;
-
-class function TAstSchema.GenerateGenerationRules: string;
-begin
- Result :=
- '''
- **CRITICAL GENERATION RULES:**
-
- 1. **NO JSON OBJECTS:** Do not use `{}`. Every node MUST be a JSON Array `["Tag", Arg1, Arg2]`.
- 2. **EXPLICIT TUPLES:** Fields defined as `Tuple` MUST be wrapped in `["Tuple", [...]]`.
- 3. **EXPLICIT NULLS:** Optional fields (`| null`) MUST be explicit `null` if not present.
- 4. **STRICT ORDER:** Array elements must follow the schema index exactly.
- 5. **OPERATORS:** Use `Call` with an `Id` for operators: `["Call", ["Id", "+"], ["Tuple", [["Const", 1], ["Const", 2]]]]`.
- 6. **ID VS KEY:** Use `Key` for record keys. Use `Id` for variables, functions, and operators.
- 7. **BOOLEANS:** The literals `true` and `false` are identifiers: `["Id", "true"]` or `["Id", "false"]`.
- 8. **SCALAR TYPES:** Valid types for series definitions are: `:Ordinal`, `:Float`, `:Boolean`, `:Text`, `:DateTime`.
- 9. **NESTED ARRAYS:** In "Cond", the pairs are an array of arrays: `[ [cond1, branch1], [cond2, branch2] ]`.
- 10. **RECURSION:** Use `Recur` for tail-recursive calls to enable optimization.
- 11. **NO COMMENTS:** Output raw JSON only.
- ''';
-end;
-
-class function TAstSchema.GenerateFullSystemPrompt(const AScope: IExecutionScope): string;
-begin
- Result :=
- '''
- You are a compiler frontend for a domain-specific scripting language.
- Your task is to generate a valid Abstract Syntax Tree (AST) in a specific Compact JSON format.
-
- ### AST Schema (TypeScript Definition)
- '''
- + sLineBreak
- + GenerateTypeScriptDefinition
- + sLineBreak
- + '### Constraints & Rules'
- + sLineBreak
- + GenerateGenerationRules
- + sLineBreak;
-
- if Assigned(AScope) then
- Result := Result + GenerateAvailableSymbols(AScope)
- else
- Result := Result + GenerateAllRtlDocumentation;
-end;
-
end.
diff --git a/Src/AST/Myc.Ast.Nodes.pas b/Src/AST/Myc.Ast.Nodes.pas
index 3c6be90..8fdc963 100644
--- a/Src/AST/Myc.Ast.Nodes.pas
+++ b/Src/AST/Myc.Ast.Nodes.pas
@@ -255,7 +255,7 @@ type
[AstDoc('A positional collection of elements (Vector).')]
[AstScriptExample('[1 2 3]')]
[AstScriptExample('["a" :b c]')]
- [AstField(0, 'elements', fkNode)]
+ [AstField(0, 'elements', fkArrayOfNodes)]
ITupleNode = interface(IAstTypedNode)
{$region 'private'}
function GetElements: TArray;
@@ -265,7 +265,7 @@ type
[AstTag('Field')]
[AstDoc('A single entry in a record literal.')]
- [AstField(0, 'key', fkNode)]
+ [AstField(0, 'key', fkKeyword)]
[AstField(1, 'value', fkNode)]
IRecordFieldNode = interface(IAstNode)
{$region 'private'}
@@ -299,10 +299,10 @@ type
[
AstScriptExample(
'''
- (? (> x 0) :positive
- (< x 0) :negative
- :zero)
- '''
+ (? (> x 0) :positive
+ (< x 0) :negative
+ :zero)
+ '''
)
]
[AstField(0, 'pairs', fkArrayOfPairs)]
@@ -360,11 +360,12 @@ type
[
AstScriptExample(
'''
- (do
- (def x 10)
- (assign x (* x 2))
- x)
- '''
+ (do
+ (def x 10)
+ (assign x (* x 2))
+ x
+ )
+ '''
)
]
[AstField(0, 'expressions', fkTuple)]
@@ -379,7 +380,7 @@ type
[AstDoc('Declares a new variable in the current scope.')]
[AstScriptExample('(def x 10)')]
[AstScriptExample('(def y)')]
- [AstField(0, 'target', fkNode)]
+ [AstField(0, 'target', fkIdentifier)]
[AstField(1, 'init', fkNullableNode)]
IVariableDeclarationNode = interface(IAstTypedNode)
{$region 'private'}
@@ -395,7 +396,7 @@ type
[AstTag('Assign')]
[AstDoc('Updates the value of an existing variable.')]
[AstScriptExample('(assign x 20)')]
- [AstField(0, 'target', fkNode)]
+ [AstField(0, 'target', fkIdentifier)]
[AstField(1, 'value', fkNode)]
IAssignmentNode = interface(IAstTypedNode)
{$region 'private'}
@@ -408,15 +409,8 @@ type
[AstTag('Macro')]
[AstDoc('Defines a compile-time syntactic macro.')]
- [
- AstScriptExample(
- '''
- (defmacro unless [c b]
- `(if ~c ... ~b))
- '''
- )
- ]
- [AstField(0, 'name', fkNode)]
+ [AstScriptExample('(defmacro unless [c b] `(if ~c ... ~b))')]
+ [AstField(0, 'name', fkIdentifier)]
[AstField(1, 'params', fkTuple)]
[AstField(2, 'body', fkNode)]
IMacroDefinitionNode = interface(IAstTypedNode)
@@ -481,7 +475,7 @@ type
[AstDoc('Accesses a record field or stream member by key.')]
[AstScriptExample('(.price rec)')]
[AstField(0, 'base', fkNode)]
- [AstField(1, 'member', fkNode)]
+ [AstField(1, 'member', fkKeyword)]
IMemberAccessNode = interface(IAstTypedNode)
{$region 'private'}
function GetBase: IAstNode;
@@ -562,16 +556,9 @@ type
[AstTag('Pipe')]
[AstDoc('Reactive pipeline from source streams to a transformation lambda.')]
- [
- AstScriptExample(
- '''
- (pipe [[src [:val]]]
- (fn [v] {:res (* v 2)}))
- '''
- )
- ]
- [AstField(0, 'inputs', fkTuple)]
- [AstField(1, 'transform', fkNode)]
+ [AstScriptExample('(pipe [[src [:val]]] (fn [v] {:res (* v 2)}))')]
+ [AstField(0, 'inputs', fkPipeInputs)]
+ [AstField(1, 'transform', fkLambda)]
IPipeNode = interface(IAstTypedNode)
{$region 'private'}
function GetInputs: ITupleNode;