From a25fec38f89ea02348b51f46e2346191150be2b0 Mon Sep 17 00:00:00 2001 From: Michael Schimmel Date: Wed, 7 Jan 2026 15:14:54 +0100 Subject: [PATCH] Json Schema WIP --- ASTPlayground/ASTPlayground.delphilsp.json | 2 +- ASTPlayground/ASTPlayground.dpr | 5 +- ASTPlayground/ASTPlayground.dproj | 3 +- ASTPlayground/MainForm.pas | 5 +- Src/AST/Myc.Ast.Attributes.pas | 14 +- Src/AST/Myc.Ast.Json.Schema.Old.pas | 424 ++++++++++++++++ Src/AST/Myc.Ast.Json.Schema.pas | 545 +++++++-------------- Src/AST/Myc.Ast.Nodes.pas | 53 +- 8 files changed, 639 insertions(+), 412 deletions(-) create mode 100644 Src/AST/Myc.Ast.Json.Schema.Old.pas 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;