@lingo-dsl/compiler 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/Compiler.d.ts +27 -0
  2. package/dist/Compiler.d.ts.map +1 -0
  3. package/dist/Compiler.js +53 -0
  4. package/dist/Compiler.js.map +1 -0
  5. package/dist/analyzer/ISemanticAnalyzer.d.ts +15 -0
  6. package/dist/analyzer/ISemanticAnalyzer.d.ts.map +1 -0
  7. package/dist/analyzer/ISemanticAnalyzer.js +3 -0
  8. package/dist/analyzer/ISemanticAnalyzer.js.map +1 -0
  9. package/dist/analyzer/LingoAnalyzer.d.ts +24 -0
  10. package/dist/analyzer/LingoAnalyzer.d.ts.map +1 -0
  11. package/dist/analyzer/LingoAnalyzer.js +204 -0
  12. package/dist/analyzer/LingoAnalyzer.js.map +1 -0
  13. package/dist/codegen/ICodeGenerator.d.ts +12 -0
  14. package/dist/codegen/ICodeGenerator.d.ts.map +1 -0
  15. package/dist/codegen/ICodeGenerator.js +3 -0
  16. package/dist/codegen/ICodeGenerator.js.map +1 -0
  17. package/dist/codegen/JSCodeGenerator.d.ts +31 -0
  18. package/dist/codegen/JSCodeGenerator.d.ts.map +1 -0
  19. package/dist/codegen/JSCodeGenerator.js +421 -0
  20. package/dist/codegen/JSCodeGenerator.js.map +1 -0
  21. package/dist/errors/ConsoleErrorReporter.d.ts +9 -0
  22. package/dist/errors/ConsoleErrorReporter.d.ts.map +1 -0
  23. package/dist/errors/ConsoleErrorReporter.js +26 -0
  24. package/dist/errors/ConsoleErrorReporter.js.map +1 -0
  25. package/dist/errors/IErrorReporter.d.ts +17 -0
  26. package/dist/errors/IErrorReporter.d.ts.map +1 -0
  27. package/dist/errors/IErrorReporter.js +9 -0
  28. package/dist/errors/IErrorReporter.js.map +1 -0
  29. package/dist/index.d.ts +15 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +32 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/parser/AST.d.ts +132 -0
  34. package/dist/parser/AST.d.ts.map +1 -0
  35. package/dist/parser/AST.js +15 -0
  36. package/dist/parser/AST.js.map +1 -0
  37. package/dist/parser/IParser.d.ts +6 -0
  38. package/dist/parser/IParser.d.ts.map +1 -0
  39. package/dist/parser/IParser.js +3 -0
  40. package/dist/parser/IParser.js.map +1 -0
  41. package/dist/parser/LingoParser.d.ts +50 -0
  42. package/dist/parser/LingoParser.d.ts.map +1 -0
  43. package/dist/parser/LingoParser.js +697 -0
  44. package/dist/parser/LingoParser.js.map +1 -0
  45. package/dist/tokenizer/ITokenizer.d.ts +5 -0
  46. package/dist/tokenizer/ITokenizer.d.ts.map +1 -0
  47. package/dist/tokenizer/ITokenizer.js +3 -0
  48. package/dist/tokenizer/ITokenizer.js.map +1 -0
  49. package/dist/tokenizer/LingoTokenizer.d.ts +31 -0
  50. package/dist/tokenizer/LingoTokenizer.d.ts.map +1 -0
  51. package/dist/tokenizer/LingoTokenizer.js +315 -0
  52. package/dist/tokenizer/LingoTokenizer.js.map +1 -0
  53. package/dist/tokenizer/Token.d.ts +107 -0
  54. package/dist/tokenizer/Token.d.ts.map +1 -0
  55. package/dist/tokenizer/Token.js +107 -0
  56. package/dist/tokenizer/Token.js.map +1 -0
  57. package/package.json +39 -0
@@ -0,0 +1,27 @@
1
+ import { ITokenizer } from "./tokenizer/ITokenizer";
2
+ import { IParser } from "./parser/IParser";
3
+ import { ISemanticAnalyzer } from "./analyzer/ISemanticAnalyzer";
4
+ import { ICodeGenerator } from "./codegen/ICodeGenerator";
5
+ import { IErrorReporter } from "./errors/IErrorReporter";
6
+ export interface CompileOptions {
7
+ customFunctionsPath?: string;
8
+ }
9
+ export interface CompilationResult {
10
+ success: boolean;
11
+ code?: string;
12
+ dependencies?: string[];
13
+ errors: any[];
14
+ }
15
+ export interface ICompiler {
16
+ compile(source: string, filename: string, options?: CompileOptions): CompilationResult;
17
+ }
18
+ export declare class Compiler implements ICompiler {
19
+ private tokenizer;
20
+ private parser;
21
+ private analyzer;
22
+ private codeGenerator;
23
+ private errorReporter;
24
+ constructor(tokenizer: ITokenizer, parser: IParser, analyzer: ISemanticAnalyzer, codeGenerator: ICodeGenerator, errorReporter: IErrorReporter);
25
+ compile(source: string, filename?: string, options?: CompileOptions): CompilationResult;
26
+ }
27
+ //# sourceMappingURL=Compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Compiler.d.ts","sourceRoot":"","sources":["../src/Compiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EACL,cAAc,EAGf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,cAAc;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,GAAG,EAAE,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,cAAc,GACvB,iBAAiB,CAAC;CACtB;AAED,qBAAa,QAAS,YAAW,SAAS;IAEtC,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,aAAa;gBAJb,SAAS,EAAE,UAAU,EACrB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,iBAAiB,EAC3B,aAAa,EAAE,cAAc,EAC7B,aAAa,EAAE,cAAc;IAGvC,OAAO,CACL,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAkB,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,iBAAiB;CA4CrB"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Compiler = void 0;
4
+ class Compiler {
5
+ constructor(tokenizer, parser, analyzer, codeGenerator, errorReporter) {
6
+ this.tokenizer = tokenizer;
7
+ this.parser = parser;
8
+ this.analyzer = analyzer;
9
+ this.codeGenerator = codeGenerator;
10
+ this.errorReporter = errorReporter;
11
+ }
12
+ compile(source, filename = "<input>", options) {
13
+ // Clear previous errors
14
+ this.errorReporter.clear();
15
+ // Tokenize
16
+ const tokens = this.tokenizer.tokenize(source, filename);
17
+ if (this.errorReporter.hasErrors()) {
18
+ return {
19
+ success: false,
20
+ errors: this.errorReporter.getErrors(),
21
+ };
22
+ }
23
+ // Parse
24
+ const ast = this.parser.parse(tokens);
25
+ if (this.errorReporter.hasErrors()) {
26
+ return {
27
+ success: false,
28
+ errors: this.errorReporter.getErrors(),
29
+ };
30
+ }
31
+ // Analyze
32
+ const analysisResult = this.analyzer.analyze(ast);
33
+ if (!analysisResult.success || this.errorReporter.hasErrors()) {
34
+ return {
35
+ success: false,
36
+ errors: this.errorReporter.getErrors(),
37
+ };
38
+ }
39
+ // Generate code with options
40
+ const codegenOptions = {
41
+ customFunctionsPath: options?.customFunctionsPath,
42
+ };
43
+ const codegenResult = this.codeGenerator.generate(ast, codegenOptions);
44
+ return {
45
+ success: true,
46
+ code: codegenResult.code,
47
+ dependencies: codegenResult.dependencies,
48
+ errors: [],
49
+ };
50
+ }
51
+ }
52
+ exports.Compiler = Compiler;
53
+ //# sourceMappingURL=Compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Compiler.js","sourceRoot":"","sources":["../src/Compiler.ts"],"names":[],"mappings":";;;AA6BA,MAAa,QAAQ;IACnB,YACU,SAAqB,EACrB,MAAe,EACf,QAA2B,EAC3B,aAA6B,EAC7B,aAA6B;QAJ7B,cAAS,GAAT,SAAS,CAAY;QACrB,WAAM,GAAN,MAAM,CAAS;QACf,aAAQ,GAAR,QAAQ,CAAmB;QAC3B,kBAAa,GAAb,aAAa,CAAgB;QAC7B,kBAAa,GAAb,aAAa,CAAgB;IACpC,CAAC;IAEJ,OAAO,CACL,MAAc,EACd,WAAmB,SAAS,EAC5B,OAAwB;QAExB,wBAAwB;QACxB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAE3B,WAAW;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;aACvC,CAAC;QACJ,CAAC;QAED,QAAQ;QACR,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC;YACnC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;aACvC,CAAC;QACJ,CAAC;QAED,UAAU;QACV,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC;YAC9D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;aACvC,CAAC;QACJ,CAAC;QAED,6BAA6B;QAC7B,MAAM,cAAc,GAAmB;YACrC,mBAAmB,EAAE,OAAO,EAAE,mBAAmB;SAClD,CAAC;QACF,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QAEvE,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,aAAa,CAAC,IAAI;YACxB,YAAY,EAAE,aAAa,CAAC,YAAY;YACxC,MAAM,EAAE,EAAE;SACX,CAAC;IACJ,CAAC;CACF;AAzDD,4BAyDC"}
@@ -0,0 +1,15 @@
1
+ import { Program } from "../parser/AST";
2
+ export interface AnalysisResult {
3
+ success: boolean;
4
+ symbolTable: Map<string, SymbolInfo>;
5
+ dependencies: Map<string, Set<string>>;
6
+ }
7
+ export interface SymbolInfo {
8
+ name: string;
9
+ type: "number" | "text" | "boolean" | "list";
10
+ isInitialized: boolean;
11
+ }
12
+ export interface ISemanticAnalyzer {
13
+ analyze(ast: Program): AnalysisResult;
14
+ }
15
+ //# sourceMappingURL=ISemanticAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISemanticAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/ISemanticAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;IAC7C,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc,CAAC;CACvC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ISemanticAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISemanticAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/ISemanticAnalyzer.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { Program } from "../parser/AST";
2
+ import { ISemanticAnalyzer, AnalysisResult } from "./ISemanticAnalyzer";
3
+ import { IErrorReporter } from "../errors/IErrorReporter";
4
+ export declare class LingoAnalyzer implements ISemanticAnalyzer {
5
+ private errorReporter;
6
+ private symbolTable;
7
+ private dependencies;
8
+ constructor(errorReporter: IErrorReporter);
9
+ analyze(ast: Program): AnalysisResult;
10
+ private collectStateDeclaration;
11
+ private validateStatement;
12
+ private validateStateDecl;
13
+ private validateShowStmt;
14
+ private validateEventBlock;
15
+ private validateAction;
16
+ private validateIfBlock;
17
+ private validateForEachBlock;
18
+ private validateValue;
19
+ private checkIdentifierExists;
20
+ private checkTypeCompatibility;
21
+ private extractTemplateDependencies;
22
+ private reportError;
23
+ }
24
+ //# sourceMappingURL=LingoAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LingoAnalyzer.d.ts","sourceRoot":"","sources":["../../src/analyzer/LingoAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAWR,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,iBAAiB,EACjB,cAAc,EAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AAEzE,qBAAa,aAAc,YAAW,iBAAiB;IAIzC,OAAO,CAAC,aAAa;IAHjC,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,YAAY,CAAuC;gBAEvC,aAAa,EAAE,cAAc;IAEjD,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,cAAc;IAuBrC,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,cAAc;IA4BtB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,oBAAoB;IA6B5B,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,sBAAsB;IAkB9B,OAAO,CAAC,2BAA2B;IAYnC,OAAO,CAAC,WAAW;CAOpB"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LingoAnalyzer = void 0;
4
+ const AST_1 = require("../parser/AST");
5
+ const IErrorReporter_1 = require("../errors/IErrorReporter");
6
+ class LingoAnalyzer {
7
+ constructor(errorReporter) {
8
+ this.errorReporter = errorReporter;
9
+ this.symbolTable = new Map();
10
+ this.dependencies = new Map();
11
+ }
12
+ analyze(ast) {
13
+ this.symbolTable = new Map();
14
+ this.dependencies = new Map();
15
+ // First pass: collect all state declarations
16
+ for (const statement of ast.statements) {
17
+ if (statement.type === AST_1.ASTNodeType.STATE_DECL) {
18
+ this.collectStateDeclaration(statement);
19
+ }
20
+ }
21
+ // Second pass: validate usage
22
+ for (const statement of ast.statements) {
23
+ this.validateStatement(statement);
24
+ }
25
+ return {
26
+ success: !this.errorReporter.hasErrors(),
27
+ symbolTable: new Map(this.symbolTable),
28
+ dependencies: new Map(this.dependencies),
29
+ };
30
+ }
31
+ collectStateDeclaration(stmt) {
32
+ if (this.symbolTable.has(stmt.identifier)) {
33
+ this.reportError(`Variable '${stmt.identifier}' is already declared`, stmt.location);
34
+ return;
35
+ }
36
+ this.symbolTable.set(stmt.identifier, {
37
+ name: stmt.identifier,
38
+ type: stmt.varType,
39
+ isInitialized: true,
40
+ });
41
+ }
42
+ validateStatement(stmt) {
43
+ switch (stmt.type) {
44
+ case AST_1.ASTNodeType.STATE_DECL:
45
+ this.validateStateDecl(stmt);
46
+ break;
47
+ case AST_1.ASTNodeType.SHOW_STMT:
48
+ this.validateShowStmt(stmt);
49
+ break;
50
+ case AST_1.ASTNodeType.EVENT_BLOCK:
51
+ this.validateEventBlock(stmt);
52
+ break;
53
+ case AST_1.ASTNodeType.IF_BLOCK:
54
+ this.validateIfBlock(stmt);
55
+ break;
56
+ case AST_1.ASTNodeType.FOR_EACH_BLOCK:
57
+ this.validateForEachBlock(stmt);
58
+ break;
59
+ }
60
+ }
61
+ validateStateDecl(stmt) {
62
+ // Validate initial value type matches declared type
63
+ if (stmt.initialValue.type !== "empty" &&
64
+ stmt.initialValue.type !== "identifier") {
65
+ const valueType = stmt.initialValue.type;
66
+ // Map value types to state types
67
+ const typeMap = {
68
+ number: "number",
69
+ text: "text",
70
+ boolean: "boolean",
71
+ };
72
+ const expectedType = typeMap[valueType];
73
+ if (expectedType !== stmt.varType && stmt.varType !== "list") {
74
+ this.reportError(`Type mismatch: cannot initialize '${stmt.varType}' with '${valueType}'`, stmt.location);
75
+ }
76
+ }
77
+ // Validate identifier in initial value
78
+ if (stmt.initialValue.type === "identifier") {
79
+ this.checkIdentifierExists(stmt.initialValue.name, stmt.location);
80
+ }
81
+ }
82
+ validateShowStmt(stmt) {
83
+ if (stmt.config.type === "saying") {
84
+ // Extract dependencies from template string
85
+ const deps = this.extractTemplateDependencies(stmt.config.template);
86
+ for (const dep of deps) {
87
+ this.checkIdentifierExists(dep, stmt.location);
88
+ }
89
+ }
90
+ else if (stmt.config.type === "called") {
91
+ // Input/widget identifier doesn't need to be declared beforehand
92
+ // It's a reference to the widget itself
93
+ }
94
+ }
95
+ validateEventBlock(stmt) {
96
+ // Validate widget reference identifier
97
+ if (stmt.widgetRef.type === "identifier") {
98
+ // Widget identifiers reference UI elements, not variables
99
+ // They're validated differently
100
+ }
101
+ // Validate actions
102
+ for (const actionStmt of stmt.actions) {
103
+ this.validateAction(actionStmt.action, actionStmt.location);
104
+ }
105
+ }
106
+ validateAction(action, location) {
107
+ switch (action.type) {
108
+ case "increase":
109
+ case "decrease":
110
+ this.checkIdentifierExists(action.identifier, location);
111
+ this.checkTypeCompatibility(action.identifier, "number", location);
112
+ break;
113
+ case "set":
114
+ this.checkIdentifierExists(action.identifier, location);
115
+ this.validateValue(action.value, location);
116
+ // Could add type compatibility check here
117
+ break;
118
+ case "add":
119
+ case "remove":
120
+ this.checkIdentifierExists(action.list, location);
121
+ this.checkTypeCompatibility(action.list, "list", location);
122
+ this.validateValue(action.value, location);
123
+ break;
124
+ case "toggle":
125
+ this.checkIdentifierExists(action.identifier, location);
126
+ this.checkTypeCompatibility(action.identifier, "boolean", location);
127
+ break;
128
+ }
129
+ }
130
+ validateIfBlock(stmt) {
131
+ // Validate condition identifier
132
+ this.checkIdentifierExists(stmt.condition.identifier, stmt.condition.location);
133
+ this.validateValue(stmt.condition.value, stmt.condition.location);
134
+ // Validate body
135
+ for (const showStmt of stmt.body) {
136
+ this.validateShowStmt(showStmt);
137
+ }
138
+ }
139
+ validateForEachBlock(stmt) {
140
+ // Validate list exists and is a list type
141
+ this.checkIdentifierExists(stmt.listName, stmt.location);
142
+ this.checkTypeCompatibility(stmt.listName, "list", stmt.location);
143
+ // Item name is a local variable in the loop scope
144
+ // In a more advanced implementation, we'd create a new scope
145
+ const originalSymbol = this.symbolTable.get(stmt.itemName);
146
+ // Temporarily add item to symbol table for body validation
147
+ this.symbolTable.set(stmt.itemName, {
148
+ name: stmt.itemName,
149
+ type: "text", // Assuming list items are text/primitives for v0.1
150
+ isInitialized: true,
151
+ });
152
+ // Validate body
153
+ for (const bodyStmt of stmt.body) {
154
+ this.validateShowStmt(bodyStmt);
155
+ }
156
+ // Restore original symbol or remove
157
+ if (originalSymbol) {
158
+ this.symbolTable.set(stmt.itemName, originalSymbol);
159
+ }
160
+ else {
161
+ this.symbolTable.delete(stmt.itemName);
162
+ }
163
+ }
164
+ validateValue(value, location) {
165
+ if (value.type === "identifier") {
166
+ this.checkIdentifierExists(value.name, location);
167
+ }
168
+ }
169
+ checkIdentifierExists(identifier, location) {
170
+ if (!this.symbolTable.has(identifier)) {
171
+ this.reportError(`Undefined variable: '${identifier}'`, location);
172
+ return false;
173
+ }
174
+ return true;
175
+ }
176
+ checkTypeCompatibility(identifier, expectedType, location) {
177
+ const symbol = this.symbolTable.get(identifier);
178
+ if (!symbol)
179
+ return false;
180
+ if (symbol.type !== expectedType) {
181
+ this.reportError(`Type error: '${identifier}' is '${symbol.type}', expected '${expectedType}'`, location);
182
+ return false;
183
+ }
184
+ return true;
185
+ }
186
+ extractTemplateDependencies(template) {
187
+ const deps = [];
188
+ const regex = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
189
+ let match;
190
+ while ((match = regex.exec(template)) !== null) {
191
+ deps.push(match[1]);
192
+ }
193
+ return deps;
194
+ }
195
+ reportError(message, location) {
196
+ this.errorReporter.report({
197
+ message,
198
+ location,
199
+ severity: IErrorReporter_1.ErrorSeverity.ERROR,
200
+ });
201
+ }
202
+ }
203
+ exports.LingoAnalyzer = LingoAnalyzer;
204
+ //# sourceMappingURL=LingoAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LingoAnalyzer.js","sourceRoot":"","sources":["../../src/analyzer/LingoAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Program } from "../parser/AST";
2
+ export interface CodegenResult {
3
+ code: string;
4
+ dependencies: string[];
5
+ }
6
+ export interface CodegenOptions {
7
+ customFunctionsPath?: string;
8
+ }
9
+ export interface ICodeGenerator {
10
+ generate(ast: Program, options?: CodegenOptions): CodegenResult;
11
+ }
12
+ //# sourceMappingURL=ICodeGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ICodeGenerator.d.ts","sourceRoot":"","sources":["../../src/codegen/ICodeGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAAC;CACjE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ICodeGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ICodeGenerator.js","sourceRoot":"","sources":["../../src/codegen/ICodeGenerator.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import { Program } from "../parser/AST";
2
+ import { ICodeGenerator, CodegenResult, CodegenOptions } from "./ICodeGenerator";
3
+ export declare class JSCodeGenerator implements ICodeGenerator {
4
+ private indent;
5
+ private widgetCounter;
6
+ private eventCounter;
7
+ private customFunctionsPath;
8
+ generate(ast: Program, options?: CodegenOptions): CodegenResult;
9
+ private generateStateDecl;
10
+ private generateShowStmt;
11
+ private generateCustomWidget;
12
+ private generateHeading;
13
+ private generateText;
14
+ private generateButton;
15
+ private generateInput;
16
+ private generateImage;
17
+ private generateContainer;
18
+ private generateGenericElement;
19
+ private getElementType;
20
+ private generateEventBlock;
21
+ private generateAction;
22
+ private generateIfBlock;
23
+ private generateForEachBlock;
24
+ private generateShowStmtForLoop;
25
+ private generateTemplateForLoop;
26
+ private generateCondition;
27
+ private generateValue;
28
+ private generateTemplate;
29
+ private indentLine;
30
+ }
31
+ //# sourceMappingURL=JSCodeGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSCodeGenerator.d.ts","sourceRoot":"","sources":["../../src/codegen/JSCodeGenerator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EAWR,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,aAAa,EACb,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,qBAAa,eAAgB,YAAW,cAAc;IACpD,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa;IA+E/D,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,gBAAgB;IAwCxB,OAAO,CAAC,oBAAoB;IA0B5B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,sBAAsB;IAgC9B,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,kBAAkB;IAoC1B,OAAO,CAAC,cAAc;IAoCtB,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,UAAU;CAGnB"}