@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.
- package/dist/Compiler.d.ts +27 -0
- package/dist/Compiler.d.ts.map +1 -0
- package/dist/Compiler.js +53 -0
- package/dist/Compiler.js.map +1 -0
- package/dist/analyzer/ISemanticAnalyzer.d.ts +15 -0
- package/dist/analyzer/ISemanticAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/ISemanticAnalyzer.js +3 -0
- package/dist/analyzer/ISemanticAnalyzer.js.map +1 -0
- package/dist/analyzer/LingoAnalyzer.d.ts +24 -0
- package/dist/analyzer/LingoAnalyzer.d.ts.map +1 -0
- package/dist/analyzer/LingoAnalyzer.js +204 -0
- package/dist/analyzer/LingoAnalyzer.js.map +1 -0
- package/dist/codegen/ICodeGenerator.d.ts +12 -0
- package/dist/codegen/ICodeGenerator.d.ts.map +1 -0
- package/dist/codegen/ICodeGenerator.js +3 -0
- package/dist/codegen/ICodeGenerator.js.map +1 -0
- package/dist/codegen/JSCodeGenerator.d.ts +31 -0
- package/dist/codegen/JSCodeGenerator.d.ts.map +1 -0
- package/dist/codegen/JSCodeGenerator.js +421 -0
- package/dist/codegen/JSCodeGenerator.js.map +1 -0
- package/dist/errors/ConsoleErrorReporter.d.ts +9 -0
- package/dist/errors/ConsoleErrorReporter.d.ts.map +1 -0
- package/dist/errors/ConsoleErrorReporter.js +26 -0
- package/dist/errors/ConsoleErrorReporter.js.map +1 -0
- package/dist/errors/IErrorReporter.d.ts +17 -0
- package/dist/errors/IErrorReporter.d.ts.map +1 -0
- package/dist/errors/IErrorReporter.js +9 -0
- package/dist/errors/IErrorReporter.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/AST.d.ts +132 -0
- package/dist/parser/AST.d.ts.map +1 -0
- package/dist/parser/AST.js +15 -0
- package/dist/parser/AST.js.map +1 -0
- package/dist/parser/IParser.d.ts +6 -0
- package/dist/parser/IParser.d.ts.map +1 -0
- package/dist/parser/IParser.js +3 -0
- package/dist/parser/IParser.js.map +1 -0
- package/dist/parser/LingoParser.d.ts +50 -0
- package/dist/parser/LingoParser.d.ts.map +1 -0
- package/dist/parser/LingoParser.js +697 -0
- package/dist/parser/LingoParser.js.map +1 -0
- package/dist/tokenizer/ITokenizer.d.ts +5 -0
- package/dist/tokenizer/ITokenizer.d.ts.map +1 -0
- package/dist/tokenizer/ITokenizer.js +3 -0
- package/dist/tokenizer/ITokenizer.js.map +1 -0
- package/dist/tokenizer/LingoTokenizer.d.ts +31 -0
- package/dist/tokenizer/LingoTokenizer.d.ts.map +1 -0
- package/dist/tokenizer/LingoTokenizer.js +315 -0
- package/dist/tokenizer/LingoTokenizer.js.map +1 -0
- package/dist/tokenizer/Token.d.ts +107 -0
- package/dist/tokenizer/Token.d.ts.map +1 -0
- package/dist/tokenizer/Token.js +107 -0
- package/dist/tokenizer/Token.js.map +1 -0
- 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"}
|
package/dist/Compiler.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|