@the-trybe/formula-engine 1.0.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 (43) hide show
  1. package/.claude/settings.local.json +6 -0
  2. package/PRD_FORMULA_ENGINE.md +1863 -0
  3. package/README.md +382 -0
  4. package/dist/decimal-utils.d.ts +180 -0
  5. package/dist/decimal-utils.js +355 -0
  6. package/dist/dependency-extractor.d.ts +20 -0
  7. package/dist/dependency-extractor.js +103 -0
  8. package/dist/dependency-graph.d.ts +60 -0
  9. package/dist/dependency-graph.js +252 -0
  10. package/dist/errors.d.ts +161 -0
  11. package/dist/errors.js +260 -0
  12. package/dist/evaluator.d.ts +51 -0
  13. package/dist/evaluator.js +494 -0
  14. package/dist/formula-engine.d.ts +79 -0
  15. package/dist/formula-engine.js +355 -0
  16. package/dist/functions.d.ts +3 -0
  17. package/dist/functions.js +720 -0
  18. package/dist/index.d.ts +10 -0
  19. package/dist/index.js +61 -0
  20. package/dist/lexer.d.ts +25 -0
  21. package/dist/lexer.js +357 -0
  22. package/dist/parser.d.ts +32 -0
  23. package/dist/parser.js +372 -0
  24. package/dist/types.d.ts +228 -0
  25. package/dist/types.js +62 -0
  26. package/jest.config.js +23 -0
  27. package/package.json +35 -0
  28. package/src/decimal-utils.ts +408 -0
  29. package/src/dependency-extractor.ts +117 -0
  30. package/src/dependency-graph.test.ts +238 -0
  31. package/src/dependency-graph.ts +288 -0
  32. package/src/errors.ts +296 -0
  33. package/src/evaluator.ts +604 -0
  34. package/src/formula-engine.test.ts +660 -0
  35. package/src/formula-engine.ts +430 -0
  36. package/src/functions.ts +770 -0
  37. package/src/index.ts +103 -0
  38. package/src/lexer.test.ts +288 -0
  39. package/src/lexer.ts +394 -0
  40. package/src/parser.test.ts +349 -0
  41. package/src/parser.ts +449 -0
  42. package/src/types.ts +347 -0
  43. package/tsconfig.json +29 -0
@@ -0,0 +1,10 @@
1
+ export { FormulaEngine } from './formula-engine';
2
+ export { FormulaEngineConfig, FormulaDefinition, EvaluationContext, FunctionDefinition, ArgumentType, FunctionImplementation, DecimalConfig, DecimalRoundingMode, RoundingConfig, EvaluationResult, EvaluationResultSet, ValidationResult, CacheStats, ErrorBehavior, SecurityConfig, ASTNode, DecimalLiteral, NumberLiteral, StringLiteral, BooleanLiteral, NullLiteral, ArrayLiteral, VariableReference, BinaryOperation, UnaryOperation, ConditionalExpression, FunctionCall, MemberAccess, IndexAccess, DependencyGraph, ValueType, FormulaValue, } from './types';
3
+ export { Parser } from './parser';
4
+ export { Lexer } from './lexer';
5
+ export { Evaluator } from './evaluator';
6
+ export { DependencyExtractor } from './dependency-extractor';
7
+ export { DependencyGraph as DependencyGraphImpl, DependencyGraphBuilder } from './dependency-graph';
8
+ export { DecimalUtils, Decimal, DecimalLike } from './decimal-utils';
9
+ export { createBuiltInFunctions } from './functions';
10
+ export { FormulaEngineError, GeneralFormulaError, ErrorCategory, SyntaxError, UnexpectedTokenError, UnterminatedStringError, InvalidNumberError, CircularDependencyError, UndefinedVariableError, UndefinedFunctionError, DuplicateFormulaError, DivisionByZeroError, TypeMismatchError, ArgumentCountError, InvalidOperationError, PropertyAccessError, IndexAccessError, DecimalError, DecimalOverflowError, DecimalUnderflowError, DecimalDivisionByZeroError, InvalidDecimalError, ConfigurationError, SecurityError, MaxIterationsError, MaxRecursionError, MaxExpressionLengthError, } from './errors';
package/dist/index.js ADDED
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MaxExpressionLengthError = exports.MaxRecursionError = exports.MaxIterationsError = exports.SecurityError = exports.ConfigurationError = exports.InvalidDecimalError = exports.DecimalDivisionByZeroError = exports.DecimalUnderflowError = exports.DecimalOverflowError = exports.DecimalError = exports.IndexAccessError = exports.PropertyAccessError = exports.InvalidOperationError = exports.ArgumentCountError = exports.TypeMismatchError = exports.DivisionByZeroError = exports.DuplicateFormulaError = exports.UndefinedFunctionError = exports.UndefinedVariableError = exports.CircularDependencyError = exports.InvalidNumberError = exports.UnterminatedStringError = exports.UnexpectedTokenError = exports.SyntaxError = exports.GeneralFormulaError = exports.FormulaEngineError = exports.createBuiltInFunctions = exports.Decimal = exports.DecimalUtils = exports.DependencyGraphBuilder = exports.DependencyGraphImpl = exports.DependencyExtractor = exports.Evaluator = exports.Lexer = exports.Parser = exports.DecimalRoundingMode = exports.FormulaEngine = void 0;
4
+ // Main exports
5
+ var formula_engine_1 = require("./formula-engine");
6
+ Object.defineProperty(exports, "FormulaEngine", { enumerable: true, get: function () { return formula_engine_1.FormulaEngine; } });
7
+ // Types
8
+ var types_1 = require("./types");
9
+ Object.defineProperty(exports, "DecimalRoundingMode", { enumerable: true, get: function () { return types_1.DecimalRoundingMode; } });
10
+ // Components (for advanced usage)
11
+ var parser_1 = require("./parser");
12
+ Object.defineProperty(exports, "Parser", { enumerable: true, get: function () { return parser_1.Parser; } });
13
+ var lexer_1 = require("./lexer");
14
+ Object.defineProperty(exports, "Lexer", { enumerable: true, get: function () { return lexer_1.Lexer; } });
15
+ var evaluator_1 = require("./evaluator");
16
+ Object.defineProperty(exports, "Evaluator", { enumerable: true, get: function () { return evaluator_1.Evaluator; } });
17
+ var dependency_extractor_1 = require("./dependency-extractor");
18
+ Object.defineProperty(exports, "DependencyExtractor", { enumerable: true, get: function () { return dependency_extractor_1.DependencyExtractor; } });
19
+ var dependency_graph_1 = require("./dependency-graph");
20
+ Object.defineProperty(exports, "DependencyGraphImpl", { enumerable: true, get: function () { return dependency_graph_1.DependencyGraph; } });
21
+ Object.defineProperty(exports, "DependencyGraphBuilder", { enumerable: true, get: function () { return dependency_graph_1.DependencyGraphBuilder; } });
22
+ var decimal_utils_1 = require("./decimal-utils");
23
+ Object.defineProperty(exports, "DecimalUtils", { enumerable: true, get: function () { return decimal_utils_1.DecimalUtils; } });
24
+ Object.defineProperty(exports, "Decimal", { enumerable: true, get: function () { return decimal_utils_1.Decimal; } });
25
+ var functions_1 = require("./functions");
26
+ Object.defineProperty(exports, "createBuiltInFunctions", { enumerable: true, get: function () { return functions_1.createBuiltInFunctions; } });
27
+ // Errors
28
+ var errors_1 = require("./errors");
29
+ Object.defineProperty(exports, "FormulaEngineError", { enumerable: true, get: function () { return errors_1.FormulaEngineError; } });
30
+ Object.defineProperty(exports, "GeneralFormulaError", { enumerable: true, get: function () { return errors_1.GeneralFormulaError; } });
31
+ // Parse errors
32
+ Object.defineProperty(exports, "SyntaxError", { enumerable: true, get: function () { return errors_1.SyntaxError; } });
33
+ Object.defineProperty(exports, "UnexpectedTokenError", { enumerable: true, get: function () { return errors_1.UnexpectedTokenError; } });
34
+ Object.defineProperty(exports, "UnterminatedStringError", { enumerable: true, get: function () { return errors_1.UnterminatedStringError; } });
35
+ Object.defineProperty(exports, "InvalidNumberError", { enumerable: true, get: function () { return errors_1.InvalidNumberError; } });
36
+ // Validation errors
37
+ Object.defineProperty(exports, "CircularDependencyError", { enumerable: true, get: function () { return errors_1.CircularDependencyError; } });
38
+ Object.defineProperty(exports, "UndefinedVariableError", { enumerable: true, get: function () { return errors_1.UndefinedVariableError; } });
39
+ Object.defineProperty(exports, "UndefinedFunctionError", { enumerable: true, get: function () { return errors_1.UndefinedFunctionError; } });
40
+ Object.defineProperty(exports, "DuplicateFormulaError", { enumerable: true, get: function () { return errors_1.DuplicateFormulaError; } });
41
+ // Evaluation errors
42
+ Object.defineProperty(exports, "DivisionByZeroError", { enumerable: true, get: function () { return errors_1.DivisionByZeroError; } });
43
+ Object.defineProperty(exports, "TypeMismatchError", { enumerable: true, get: function () { return errors_1.TypeMismatchError; } });
44
+ Object.defineProperty(exports, "ArgumentCountError", { enumerable: true, get: function () { return errors_1.ArgumentCountError; } });
45
+ Object.defineProperty(exports, "InvalidOperationError", { enumerable: true, get: function () { return errors_1.InvalidOperationError; } });
46
+ Object.defineProperty(exports, "PropertyAccessError", { enumerable: true, get: function () { return errors_1.PropertyAccessError; } });
47
+ Object.defineProperty(exports, "IndexAccessError", { enumerable: true, get: function () { return errors_1.IndexAccessError; } });
48
+ // Decimal errors
49
+ Object.defineProperty(exports, "DecimalError", { enumerable: true, get: function () { return errors_1.DecimalError; } });
50
+ Object.defineProperty(exports, "DecimalOverflowError", { enumerable: true, get: function () { return errors_1.DecimalOverflowError; } });
51
+ Object.defineProperty(exports, "DecimalUnderflowError", { enumerable: true, get: function () { return errors_1.DecimalUnderflowError; } });
52
+ Object.defineProperty(exports, "DecimalDivisionByZeroError", { enumerable: true, get: function () { return errors_1.DecimalDivisionByZeroError; } });
53
+ Object.defineProperty(exports, "InvalidDecimalError", { enumerable: true, get: function () { return errors_1.InvalidDecimalError; } });
54
+ // Configuration errors
55
+ Object.defineProperty(exports, "ConfigurationError", { enumerable: true, get: function () { return errors_1.ConfigurationError; } });
56
+ // Security errors
57
+ Object.defineProperty(exports, "SecurityError", { enumerable: true, get: function () { return errors_1.SecurityError; } });
58
+ Object.defineProperty(exports, "MaxIterationsError", { enumerable: true, get: function () { return errors_1.MaxIterationsError; } });
59
+ Object.defineProperty(exports, "MaxRecursionError", { enumerable: true, get: function () { return errors_1.MaxRecursionError; } });
60
+ Object.defineProperty(exports, "MaxExpressionLengthError", { enumerable: true, get: function () { return errors_1.MaxExpressionLengthError; } });
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsZUFBZTtBQUNmLG1EQUFpRDtBQUF4QywrR0FBQSxhQUFhLE9BQUE7QUFFdEIsUUFBUTtBQUNSLGlDQThDaUI7QUFuQ2YsNEdBQUEsbUJBQW1CLE9BQUE7QUFxQ3JCLGtDQUFrQztBQUNsQyxtQ0FBa0M7QUFBekIsZ0dBQUEsTUFBTSxPQUFBO0FBQ2YsaUNBQWdDO0FBQXZCLDhGQUFBLEtBQUssT0FBQTtBQUNkLHlDQUF3QztBQUEvQixzR0FBQSxTQUFTLE9BQUE7QUFDbEIsK0RBQTZEO0FBQXBELDJIQUFBLG1CQUFtQixPQUFBO0FBQzVCLHVEQUFvRztBQUEzRix1SEFBQSxlQUFlLE9BQXVCO0FBQUUsMEhBQUEsc0JBQXNCLE9BQUE7QUFDdkUsaURBQXFFO0FBQTVELDZHQUFBLFlBQVksT0FBQTtBQUFFLHdHQUFBLE9BQU8sT0FBQTtBQUM5Qix5Q0FBcUQ7QUFBNUMsbUhBQUEsc0JBQXNCLE9BQUE7QUFFL0IsU0FBUztBQUNULG1DQXdDa0I7QUF2Q2hCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLDZHQUFBLG1CQUFtQixPQUFBO0FBR25CLGVBQWU7QUFDZixxR0FBQSxXQUFXLE9BQUE7QUFDWCw4R0FBQSxvQkFBb0IsT0FBQTtBQUNwQixpSEFBQSx1QkFBdUIsT0FBQTtBQUN2Qiw0R0FBQSxrQkFBa0IsT0FBQTtBQUVsQixvQkFBb0I7QUFDcEIsaUhBQUEsdUJBQXVCLE9BQUE7QUFDdkIsZ0hBQUEsc0JBQXNCLE9BQUE7QUFDdEIsZ0hBQUEsc0JBQXNCLE9BQUE7QUFDdEIsK0dBQUEscUJBQXFCLE9BQUE7QUFFckIsb0JBQW9CO0FBQ3BCLDZHQUFBLG1CQUFtQixPQUFBO0FBQ25CLDJHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLHFCQUFxQixPQUFBO0FBQ3JCLDZHQUFBLG1CQUFtQixPQUFBO0FBQ25CLDBHQUFBLGdCQUFnQixPQUFBO0FBRWhCLGlCQUFpQjtBQUNqQixzR0FBQSxZQUFZLE9BQUE7QUFDWiw4R0FBQSxvQkFBb0IsT0FBQTtBQUNwQiwrR0FBQSxxQkFBcUIsT0FBQTtBQUNyQixvSEFBQSwwQkFBMEIsT0FBQTtBQUMxQiw2R0FBQSxtQkFBbUIsT0FBQTtBQUVuQix1QkFBdUI7QUFDdkIsNEdBQUEsa0JBQWtCLE9BQUE7QUFFbEIsa0JBQWtCO0FBQ2xCLHVHQUFBLGFBQWEsT0FBQTtBQUNiLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLDJHQUFBLGlCQUFpQixPQUFBO0FBQ2pCLGtIQUFBLHdCQUF3QixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gTWFpbiBleHBvcnRzXG5leHBvcnQgeyBGb3JtdWxhRW5naW5lIH0gZnJvbSAnLi9mb3JtdWxhLWVuZ2luZSc7XG5cbi8vIFR5cGVzXG5leHBvcnQge1xuICAvLyBDb25maWd1cmF0aW9uXG4gIEZvcm11bGFFbmdpbmVDb25maWcsXG4gIEZvcm11bGFEZWZpbml0aW9uLFxuICBFdmFsdWF0aW9uQ29udGV4dCxcbiAgRnVuY3Rpb25EZWZpbml0aW9uLFxuICBBcmd1bWVudFR5cGUsXG4gIEZ1bmN0aW9uSW1wbGVtZW50YXRpb24sXG5cbiAgLy8gRGVjaW1hbFxuICBEZWNpbWFsQ29uZmlnLFxuICBEZWNpbWFsUm91bmRpbmdNb2RlLFxuICBSb3VuZGluZ0NvbmZpZyxcblxuICAvLyBSZXN1bHRzXG4gIEV2YWx1YXRpb25SZXN1bHQsXG4gIEV2YWx1YXRpb25SZXN1bHRTZXQsXG4gIFZhbGlkYXRpb25SZXN1bHQsXG4gIENhY2hlU3RhdHMsXG5cbiAgLy8gRXJyb3IgaGFuZGxpbmdcbiAgRXJyb3JCZWhhdmlvcixcbiAgU2VjdXJpdHlDb25maWcsXG5cbiAgLy8gQVNUIG5vZGVzXG4gIEFTVE5vZGUsXG4gIERlY2ltYWxMaXRlcmFsLFxuICBOdW1iZXJMaXRlcmFsLFxuICBTdHJpbmdMaXRlcmFsLFxuICBCb29sZWFuTGl0ZXJhbCxcbiAgTnVsbExpdGVyYWwsXG4gIEFycmF5TGl0ZXJhbCxcbiAgVmFyaWFibGVSZWZlcmVuY2UsXG4gIEJpbmFyeU9wZXJhdGlvbixcbiAgVW5hcnlPcGVyYXRpb24sXG4gIENvbmRpdGlvbmFsRXhwcmVzc2lvbixcbiAgRnVuY3Rpb25DYWxsLFxuICBNZW1iZXJBY2Nlc3MsXG4gIEluZGV4QWNjZXNzLFxuXG4gIC8vIEdyYXBoXG4gIERlcGVuZGVuY3lHcmFwaCxcblxuICAvLyBWYWx1ZXNcbiAgVmFsdWVUeXBlLFxuICBGb3JtdWxhVmFsdWUsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBDb21wb25lbnRzIChmb3IgYWR2YW5jZWQgdXNhZ2UpXG5leHBvcnQgeyBQYXJzZXIgfSBmcm9tICcuL3BhcnNlcic7XG5leHBvcnQgeyBMZXhlciB9IGZyb20gJy4vbGV4ZXInO1xuZXhwb3J0IHsgRXZhbHVhdG9yIH0gZnJvbSAnLi9ldmFsdWF0b3InO1xuZXhwb3J0IHsgRGVwZW5kZW5jeUV4dHJhY3RvciB9IGZyb20gJy4vZGVwZW5kZW5jeS1leHRyYWN0b3InO1xuZXhwb3J0IHsgRGVwZW5kZW5jeUdyYXBoIGFzIERlcGVuZGVuY3lHcmFwaEltcGwsIERlcGVuZGVuY3lHcmFwaEJ1aWxkZXIgfSBmcm9tICcuL2RlcGVuZGVuY3ktZ3JhcGgnO1xuZXhwb3J0IHsgRGVjaW1hbFV0aWxzLCBEZWNpbWFsLCBEZWNpbWFsTGlrZSB9IGZyb20gJy4vZGVjaW1hbC11dGlscyc7XG5leHBvcnQgeyBjcmVhdGVCdWlsdEluRnVuY3Rpb25zIH0gZnJvbSAnLi9mdW5jdGlvbnMnO1xuXG4vLyBFcnJvcnNcbmV4cG9ydCB7XG4gIEZvcm11bGFFbmdpbmVFcnJvcixcbiAgR2VuZXJhbEZvcm11bGFFcnJvcixcbiAgRXJyb3JDYXRlZ29yeSxcblxuICAvLyBQYXJzZSBlcnJvcnNcbiAgU3ludGF4RXJyb3IsXG4gIFVuZXhwZWN0ZWRUb2tlbkVycm9yLFxuICBVbnRlcm1pbmF0ZWRTdHJpbmdFcnJvcixcbiAgSW52YWxpZE51bWJlckVycm9yLFxuXG4gIC8vIFZhbGlkYXRpb24gZXJyb3JzXG4gIENpcmN1bGFyRGVwZW5kZW5jeUVycm9yLFxuICBVbmRlZmluZWRWYXJpYWJsZUVycm9yLFxuICBVbmRlZmluZWRGdW5jdGlvbkVycm9yLFxuICBEdXBsaWNhdGVGb3JtdWxhRXJyb3IsXG5cbiAgLy8gRXZhbHVhdGlvbiBlcnJvcnNcbiAgRGl2aXNpb25CeVplcm9FcnJvcixcbiAgVHlwZU1pc21hdGNoRXJyb3IsXG4gIEFyZ3VtZW50Q291bnRFcnJvcixcbiAgSW52YWxpZE9wZXJhdGlvbkVycm9yLFxuICBQcm9wZXJ0eUFjY2Vzc0Vycm9yLFxuICBJbmRleEFjY2Vzc0Vycm9yLFxuXG4gIC8vIERlY2ltYWwgZXJyb3JzXG4gIERlY2ltYWxFcnJvcixcbiAgRGVjaW1hbE92ZXJmbG93RXJyb3IsXG4gIERlY2ltYWxVbmRlcmZsb3dFcnJvcixcbiAgRGVjaW1hbERpdmlzaW9uQnlaZXJvRXJyb3IsXG4gIEludmFsaWREZWNpbWFsRXJyb3IsXG5cbiAgLy8gQ29uZmlndXJhdGlvbiBlcnJvcnNcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuXG4gIC8vIFNlY3VyaXR5IGVycm9yc1xuICBTZWN1cml0eUVycm9yLFxuICBNYXhJdGVyYXRpb25zRXJyb3IsXG4gIE1heFJlY3Vyc2lvbkVycm9yLFxuICBNYXhFeHByZXNzaW9uTGVuZ3RoRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import { Token } from './types';
2
+ export declare class Lexer {
3
+ private input;
4
+ private position;
5
+ private line;
6
+ private column;
7
+ private tokens;
8
+ constructor(input: string);
9
+ tokenize(): Token[];
10
+ private isAtEnd;
11
+ private peek;
12
+ private peekNext;
13
+ private advance;
14
+ private skipWhitespace;
15
+ private addToken;
16
+ private scanToken;
17
+ private isDigit;
18
+ private isAlpha;
19
+ private isAlphaNumeric;
20
+ private scanVariable;
21
+ private scanContextVariable;
22
+ private scanString;
23
+ private scanNumber;
24
+ private scanIdentifier;
25
+ }
package/dist/lexer.js ADDED
@@ -0,0 +1,357 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Lexer = void 0;
4
+ const types_1 = require("./types");
5
+ const errors_1 = require("./errors");
6
+ const KEYWORDS = {
7
+ 'true': types_1.TokenType.BOOLEAN,
8
+ 'false': types_1.TokenType.BOOLEAN,
9
+ 'null': types_1.TokenType.NULL,
10
+ 'AND': types_1.TokenType.AND,
11
+ 'OR': types_1.TokenType.OR,
12
+ 'NOT': types_1.TokenType.NOT,
13
+ };
14
+ class Lexer {
15
+ constructor(input) {
16
+ this.position = 0;
17
+ this.line = 1;
18
+ this.column = 1;
19
+ this.tokens = [];
20
+ this.input = input;
21
+ }
22
+ tokenize() {
23
+ this.tokens = [];
24
+ this.position = 0;
25
+ this.line = 1;
26
+ this.column = 1;
27
+ while (!this.isAtEnd()) {
28
+ this.skipWhitespace();
29
+ if (!this.isAtEnd()) {
30
+ this.scanToken();
31
+ }
32
+ }
33
+ this.tokens.push({
34
+ type: types_1.TokenType.EOF,
35
+ value: null,
36
+ position: this.position,
37
+ line: this.line,
38
+ column: this.column,
39
+ });
40
+ return this.tokens;
41
+ }
42
+ isAtEnd() {
43
+ return this.position >= this.input.length;
44
+ }
45
+ peek() {
46
+ if (this.isAtEnd())
47
+ return '\0';
48
+ return this.input[this.position];
49
+ }
50
+ peekNext() {
51
+ if (this.position + 1 >= this.input.length)
52
+ return '\0';
53
+ return this.input[this.position + 1];
54
+ }
55
+ advance() {
56
+ const char = this.input[this.position++];
57
+ if (char === '\n') {
58
+ this.line++;
59
+ this.column = 1;
60
+ }
61
+ else {
62
+ this.column++;
63
+ }
64
+ return char;
65
+ }
66
+ skipWhitespace() {
67
+ while (!this.isAtEnd()) {
68
+ const char = this.peek();
69
+ if (char === ' ' || char === '\t' || char === '\r' || char === '\n') {
70
+ this.advance();
71
+ }
72
+ else {
73
+ break;
74
+ }
75
+ }
76
+ }
77
+ addToken(type, value) {
78
+ this.tokens.push({
79
+ type,
80
+ value,
81
+ position: this.position,
82
+ line: this.line,
83
+ column: this.column,
84
+ });
85
+ }
86
+ scanToken() {
87
+ const startPosition = this.position;
88
+ const startLine = this.line;
89
+ const startColumn = this.column;
90
+ const char = this.advance();
91
+ switch (char) {
92
+ case '(':
93
+ this.addToken(types_1.TokenType.LPAREN, '(');
94
+ break;
95
+ case ')':
96
+ this.addToken(types_1.TokenType.RPAREN, ')');
97
+ break;
98
+ case '[':
99
+ this.addToken(types_1.TokenType.LBRACKET, '[');
100
+ break;
101
+ case ']':
102
+ this.addToken(types_1.TokenType.RBRACKET, ']');
103
+ break;
104
+ case ',':
105
+ this.addToken(types_1.TokenType.COMMA, ',');
106
+ break;
107
+ case '.':
108
+ this.addToken(types_1.TokenType.DOT, '.');
109
+ break;
110
+ case '?':
111
+ this.addToken(types_1.TokenType.QUESTION, '?');
112
+ break;
113
+ case ':':
114
+ this.addToken(types_1.TokenType.COLON, ':');
115
+ break;
116
+ case '+':
117
+ this.addToken(types_1.TokenType.PLUS, '+');
118
+ break;
119
+ case '-':
120
+ this.addToken(types_1.TokenType.MINUS, '-');
121
+ break;
122
+ case '*':
123
+ this.addToken(types_1.TokenType.MULTIPLY, '*');
124
+ break;
125
+ case '/':
126
+ this.addToken(types_1.TokenType.DIVIDE, '/');
127
+ break;
128
+ case '%':
129
+ this.addToken(types_1.TokenType.MODULO, '%');
130
+ break;
131
+ case '^':
132
+ this.addToken(types_1.TokenType.POWER, '^');
133
+ break;
134
+ case '=':
135
+ if (this.peek() === '=') {
136
+ this.advance();
137
+ this.addToken(types_1.TokenType.EQ, '==');
138
+ }
139
+ else {
140
+ throw new errors_1.SyntaxError(`Unexpected character '${char}'`, startPosition, startLine, startColumn, this.input);
141
+ }
142
+ break;
143
+ case '!':
144
+ if (this.peek() === '=') {
145
+ this.advance();
146
+ this.addToken(types_1.TokenType.NEQ, '!=');
147
+ }
148
+ else {
149
+ this.addToken(types_1.TokenType.NOT, '!');
150
+ }
151
+ break;
152
+ case '<':
153
+ if (this.peek() === '=') {
154
+ this.advance();
155
+ this.addToken(types_1.TokenType.LTE, '<=');
156
+ }
157
+ else {
158
+ this.addToken(types_1.TokenType.LT, '<');
159
+ }
160
+ break;
161
+ case '>':
162
+ if (this.peek() === '=') {
163
+ this.advance();
164
+ this.addToken(types_1.TokenType.GTE, '>=');
165
+ }
166
+ else {
167
+ this.addToken(types_1.TokenType.GT, '>');
168
+ }
169
+ break;
170
+ case '&':
171
+ if (this.peek() === '&') {
172
+ this.advance();
173
+ this.addToken(types_1.TokenType.AND, '&&');
174
+ }
175
+ else {
176
+ throw new errors_1.SyntaxError(`Unexpected character '${char}'`, startPosition, startLine, startColumn, this.input);
177
+ }
178
+ break;
179
+ case '|':
180
+ if (this.peek() === '|') {
181
+ this.advance();
182
+ this.addToken(types_1.TokenType.OR, '||');
183
+ }
184
+ else {
185
+ throw new errors_1.SyntaxError(`Unexpected character '${char}'`, startPosition, startLine, startColumn, this.input);
186
+ }
187
+ break;
188
+ case '$':
189
+ this.scanVariable();
190
+ break;
191
+ case '@':
192
+ this.scanContextVariable();
193
+ break;
194
+ case '"':
195
+ case "'":
196
+ this.scanString(char);
197
+ break;
198
+ default:
199
+ if (this.isDigit(char)) {
200
+ this.scanNumber(char);
201
+ }
202
+ else if (this.isAlpha(char)) {
203
+ this.scanIdentifier(char);
204
+ }
205
+ else {
206
+ throw new errors_1.SyntaxError(`Unexpected character '${char}'`, startPosition, startLine, startColumn, this.input);
207
+ }
208
+ }
209
+ }
210
+ isDigit(char) {
211
+ return char >= '0' && char <= '9';
212
+ }
213
+ isAlpha(char) {
214
+ return (char >= 'a' && char <= 'z') ||
215
+ (char >= 'A' && char <= 'Z') ||
216
+ char === '_';
217
+ }
218
+ isAlphaNumeric(char) {
219
+ return this.isAlpha(char) || this.isDigit(char);
220
+ }
221
+ scanVariable() {
222
+ let name = '';
223
+ while (!this.isAtEnd() && this.isAlphaNumeric(this.peek())) {
224
+ name += this.advance();
225
+ }
226
+ if (name === '') {
227
+ throw new errors_1.SyntaxError('Expected variable name after $', this.position, this.line, this.column, this.input);
228
+ }
229
+ this.addToken(types_1.TokenType.VARIABLE, name);
230
+ }
231
+ scanContextVariable() {
232
+ let name = '';
233
+ while (!this.isAtEnd() && this.isAlphaNumeric(this.peek())) {
234
+ name += this.advance();
235
+ }
236
+ if (name === '') {
237
+ throw new errors_1.SyntaxError('Expected variable name after @', this.position, this.line, this.column, this.input);
238
+ }
239
+ this.addToken(types_1.TokenType.CONTEXT_VAR, name);
240
+ }
241
+ scanString(quote) {
242
+ const startPosition = this.position - 1;
243
+ let value = '';
244
+ while (!this.isAtEnd() && this.peek() !== quote) {
245
+ if (this.peek() === '\\') {
246
+ this.advance();
247
+ if (!this.isAtEnd()) {
248
+ const escaped = this.advance();
249
+ switch (escaped) {
250
+ case 'n':
251
+ value += '\n';
252
+ break;
253
+ case 't':
254
+ value += '\t';
255
+ break;
256
+ case 'r':
257
+ value += '\r';
258
+ break;
259
+ case '\\':
260
+ value += '\\';
261
+ break;
262
+ case '"':
263
+ value += '"';
264
+ break;
265
+ case "'":
266
+ value += "'";
267
+ break;
268
+ default: value += escaped;
269
+ }
270
+ }
271
+ }
272
+ else {
273
+ value += this.advance();
274
+ }
275
+ }
276
+ if (this.isAtEnd()) {
277
+ throw new errors_1.UnterminatedStringError(startPosition);
278
+ }
279
+ this.advance(); // Consume closing quote
280
+ this.addToken(types_1.TokenType.STRING, value);
281
+ }
282
+ scanNumber(firstChar) {
283
+ const startPosition = this.position - 1;
284
+ let numStr = firstChar;
285
+ let isFloat = false;
286
+ // Integer part
287
+ while (!this.isAtEnd() && this.isDigit(this.peek())) {
288
+ numStr += this.advance();
289
+ }
290
+ // Decimal part
291
+ if (this.peek() === '.' && this.isDigit(this.peekNext())) {
292
+ numStr += this.advance(); // consume '.'
293
+ while (!this.isAtEnd() && this.isDigit(this.peek())) {
294
+ numStr += this.advance();
295
+ }
296
+ }
297
+ // Exponent part
298
+ if (this.peek() === 'e' || this.peek() === 'E') {
299
+ numStr += this.advance();
300
+ if (this.peek() === '+' || this.peek() === '-') {
301
+ numStr += this.advance();
302
+ }
303
+ if (!this.isDigit(this.peek())) {
304
+ throw new errors_1.InvalidNumberError(numStr, startPosition);
305
+ }
306
+ while (!this.isAtEnd() && this.isDigit(this.peek())) {
307
+ numStr += this.advance();
308
+ }
309
+ isFloat = true; // Scientific notation is treated as float
310
+ }
311
+ // Check for float suffix 'f'
312
+ if (this.peek() === 'f' || this.peek() === 'F') {
313
+ this.advance();
314
+ isFloat = true;
315
+ }
316
+ // Check for decimal suffix 'd'
317
+ if (this.peek() === 'd' || this.peek() === 'D') {
318
+ this.advance();
319
+ isFloat = false;
320
+ }
321
+ if (isFloat) {
322
+ const value = parseFloat(numStr);
323
+ if (isNaN(value)) {
324
+ throw new errors_1.InvalidNumberError(numStr, startPosition);
325
+ }
326
+ this.addToken(types_1.TokenType.NUMBER, value);
327
+ }
328
+ else {
329
+ // Store as string to preserve precision for Decimal
330
+ this.addToken(types_1.TokenType.NUMBER, numStr);
331
+ }
332
+ }
333
+ scanIdentifier(firstChar) {
334
+ let name = firstChar;
335
+ while (!this.isAtEnd() && this.isAlphaNumeric(this.peek())) {
336
+ name += this.advance();
337
+ }
338
+ // Check if it's a keyword
339
+ const keywordType = KEYWORDS[name] || KEYWORDS[name.toUpperCase()];
340
+ if (keywordType) {
341
+ if (keywordType === types_1.TokenType.BOOLEAN) {
342
+ this.addToken(types_1.TokenType.BOOLEAN, name.toLowerCase() === 'true');
343
+ }
344
+ else if (keywordType === types_1.TokenType.NULL) {
345
+ this.addToken(types_1.TokenType.NULL, null);
346
+ }
347
+ else {
348
+ this.addToken(keywordType, name.toUpperCase());
349
+ }
350
+ }
351
+ else {
352
+ this.addToken(types_1.TokenType.IDENTIFIER, name);
353
+ }
354
+ }
355
+ }
356
+ exports.Lexer = Lexer;
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV4ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvbGV4ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTJDO0FBQzNDLHFDQUFvRjtBQUVwRixNQUFNLFFBQVEsR0FBOEI7SUFDMUMsTUFBTSxFQUFFLGlCQUFTLENBQUMsT0FBTztJQUN6QixPQUFPLEVBQUUsaUJBQVMsQ0FBQyxPQUFPO0lBQzFCLE1BQU0sRUFBRSxpQkFBUyxDQUFDLElBQUk7SUFDdEIsS0FBSyxFQUFFLGlCQUFTLENBQUMsR0FBRztJQUNwQixJQUFJLEVBQUUsaUJBQVMsQ0FBQyxFQUFFO0lBQ2xCLEtBQUssRUFBRSxpQkFBUyxDQUFDLEdBQUc7Q0FDckIsQ0FBQztBQUVGLE1BQWEsS0FBSztJQU9oQixZQUFZLEtBQWE7UUFMakIsYUFBUSxHQUFXLENBQUMsQ0FBQztRQUNyQixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFdBQU0sR0FBVyxDQUFDLENBQUM7UUFDbkIsV0FBTSxHQUFZLEVBQUUsQ0FBQztRQUczQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFaEIsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lB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QkFDTixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNqRCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLGlCQUFTLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE3WEQsc0JBNlhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVG9rZW4sIFRva2VuVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU3ludGF4RXJyb3IsIFVudGVybWluYXRlZFN0cmluZ0Vycm9yLCBJbnZhbGlkTnVtYmVyRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5cbmNvbnN0IEtFWVdPUkRTOiBSZWNvcmQ8c3RyaW5nLCBUb2tlblR5cGU+ID0ge1xuICAndHJ1ZSc6IFRva2VuVHlwZS5CT09MRUFOLFxuICAnZmFsc2UnOiBUb2tlblR5cGUuQk9PTEVBTixcbiAgJ251bGwnOiBUb2tlblR5cGUuTlVMTCxcbiAgJ0FORCc6IFRva2VuVHlwZS5BTkQsXG4gICdPUic6IFRva2VuVHlwZS5PUixcbiAgJ05PVCc6IFRva2VuVHlwZS5OT1QsXG59O1xuXG5leHBvcnQgY2xhc3MgTGV4ZXIge1xuICBwcml2YXRlIGlucHV0OiBzdHJpbmc7XG4gIHByaXZhdGUgcG9zaXRpb246IG51bWJlciA9IDA7XG4gIHByaXZhdGUgbGluZTogbnVtYmVyID0gMTtcbiAgcHJpdmF0ZSBjb2x1bW46IG51bWJlciA9IDE7XG4gIHByaXZhdGUgdG9rZW5zOiBUb2tlbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoaW5wdXQ6IHN0cmluZykge1xuICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgfVxuXG4gIHRva2VuaXplKCk6IFRva2VuW10ge1xuICAgIHRoaXMudG9rZW5zID0gW107XG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gICAgdGhpcy5saW5lID0gMTtcbiAgICB0aGlzLmNvbHVtbiA9IDE7XG5cbiAgICB3aGlsZSAoIXRoaXMuaXNBdEVuZCgpKSB7XG4gICAgICB0aGlzLnNraXBXaGl0ZXNwYWNlKCk7XG4gICAgICBpZiAoIXRoaXMuaXNBdEVuZCgpKSB7XG4gICAgICAgIHRoaXMuc2NhblRva2VuKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50b2tlbnMucHVzaCh7XG4gICAgICB0eXBlOiBUb2tlblR5cGUuRU9GLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBwb3NpdGlvbjogdGhpcy5wb3NpdGlvbixcbiAgICAgIGxpbmU6IHRoaXMubGluZSxcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy50b2tlbnM7XG4gIH1cblxuICBwcml2YXRlIGlzQXRFbmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb24gPj0gdGhpcy5pbnB1dC5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIHBlZWsoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5pc0F0RW5kKCkpIHJldHVybiAnXFwwJztcbiAgICByZXR1cm4gdGhpcy5pbnB1dFt0aGlzLnBvc2l0aW9uXTtcbiAgfVxuXG4gIHByaXZhdGUgcGVla05leHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5wb3NpdGlvbiArIDEgPj0gdGhpcy5pbnB1dC5sZW5ndGgpIHJldHVybiAnXFwwJztcbiAgICByZXR1cm4gdGhpcy5pbnB1dFt0aGlzLnBvc2l0aW9uICsgMV07XG4gIH1cblxuICBwcml2YXRlIGFkdmFuY2UoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjaGFyID0gdGhpcy5pbnB1dFt0aGlzLnBvc2l0aW9uKytdO1xuICAgIGlmIChjaGFyID09PSAnXFxuJykge1xuICAgICAgdGhpcy5saW5lKys7XG4gICAgICB0aGlzLmNvbHVtbiA9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29sdW1uKys7XG4gICAgfVxuICAgIHJldHVybiBjaGFyO1xuICB9XG5cbiAgcHJpdmF0ZSBza2lwV2hpdGVzcGFjZSgpOiB2b2lkIHtcbiAgICB3aGlsZSAoIXRoaXMuaXNBdEVuZCgpKSB7XG4gICAgICBjb25zdCBjaGFyID0gdGhpcy5wZWVrKCk7XG4gICAgICBpZiAoY2hhciA9PT0gJyAnIHx8IGNoYXIgPT09ICdcXHQnIHx8IGNoYXIgPT09ICdcXHInIHx8IGNoYXIgPT09ICdcXG4nKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRUb2tlbih0eXBlOiBUb2tlblR5cGUsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnB1c2goe1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcG9zaXRpb246IHRoaXMucG9zaXRpb24sXG4gICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzY2FuVG9rZW4oKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IHRoaXMucG9zaXRpb247XG4gICAgY29uc3Qgc3RhcnRMaW5lID0gdGhpcy5saW5lO1xuICAgIGNvbnN0IHN0YXJ0Q29sdW1uID0gdGhpcy5jb2x1bW47XG4gICAgY29uc3QgY2hhciA9IHRoaXMuYWR2YW5jZSgpO1xuXG4gICAgc3dpdGNoIChjaGFyKSB7XG4gICAgICBjYXNlICcoJzpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuTFBBUkVOLCAnKCcpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyknOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5SUEFSRU4sICcpJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkxCUkFDS0VULCAnWycpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ10nOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5SQlJBQ0tFVCwgJ10nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcsJzpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuQ09NTUEsICcsJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLic6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkRPVCwgJy4nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc/JzpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuUVVFU1RJT04sICc/Jyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnOic6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkNPTE9OLCAnOicpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJysnOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5QTFVTLCAnKycpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJy0nOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5NSU5VUywgJy0nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcqJzpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuTVVMVElQTFksICcqJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnLyc6XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkRJVklERSwgJy8nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICclJzpcbiAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuTU9EVUxPLCAnJScpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ14nOlxuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5QT1dFUiwgJ14nKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICc9JzpcbiAgICAgICAgaWYgKHRoaXMucGVlaygpID09PSAnPScpIHtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5FUSwgJz09Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgICAgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyICcke2NoYXJ9J2AsXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uLFxuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW4sXG4gICAgICAgICAgICB0aGlzLmlucHV0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyEnOlxuICAgICAgICBpZiAodGhpcy5wZWVrKCkgPT09ICc9Jykge1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLk5FUSwgJyE9Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuTk9ULCAnIScpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIGlmICh0aGlzLnBlZWsoKSA9PT0gJz0nKSB7XG4gICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuTFRFLCAnPD0nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5MVCwgJzwnKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJz4nOlxuICAgICAgICBpZiAodGhpcy5wZWVrKCkgPT09ICc9Jykge1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkdURSwgJz49Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuR1QsICc+Jyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcmJzpcbiAgICAgICAgaWYgKHRoaXMucGVlaygpID09PSAnJicpIHtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5BTkQsICcmJicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGBVbmV4cGVjdGVkIGNoYXJhY3RlciAnJHtjaGFyfSdgLFxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbixcbiAgICAgICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uLFxuICAgICAgICAgICAgdGhpcy5pbnB1dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd8JzpcbiAgICAgICAgaWYgKHRoaXMucGVlaygpID09PSAnfCcpIHtcbiAgICAgICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5PUiwgJ3x8Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFxuICAgICAgICAgICAgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyICcke2NoYXJ9J2AsXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uLFxuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW4sXG4gICAgICAgICAgICB0aGlzLmlucHV0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJyQnOlxuICAgICAgICB0aGlzLnNjYW5WYXJpYWJsZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0AnOlxuICAgICAgICB0aGlzLnNjYW5Db250ZXh0VmFyaWFibGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdcIic6XG4gICAgICBjYXNlIFwiJ1wiOlxuICAgICAgICB0aGlzLnNjYW5TdHJpbmcoY2hhcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHRoaXMuaXNEaWdpdChjaGFyKSkge1xuICAgICAgICAgIHRoaXMuc2Nhbk51bWJlcihjaGFyKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzQWxwaGEoY2hhcikpIHtcbiAgICAgICAgICB0aGlzLnNjYW5JZGVudGlmaWVyKGNoYXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgICAgIGBVbmV4cGVjdGVkIGNoYXJhY3RlciAnJHtjaGFyfSdgLFxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbixcbiAgICAgICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uLFxuICAgICAgICAgICAgdGhpcy5pbnB1dFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzRGlnaXQoY2hhcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoYXIgPj0gJzAnICYmIGNoYXIgPD0gJzknO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FscGhhKGNoYXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoY2hhciA+PSAnYScgJiYgY2hhciA8PSAneicpIHx8XG4gICAgICAgICAgIChjaGFyID49ICdBJyAmJiBjaGFyIDw9ICdaJykgfHxcbiAgICAgICAgICAgY2hhciA9PT0gJ18nO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FscGhhTnVtZXJpYyhjaGFyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0FscGhhKGNoYXIpIHx8IHRoaXMuaXNEaWdpdChjaGFyKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NhblZhcmlhYmxlKCk6IHZvaWQge1xuICAgIGxldCBuYW1lID0gJyc7XG4gICAgd2hpbGUgKCF0aGlzLmlzQXRFbmQoKSAmJiB0aGlzLmlzQWxwaGFOdW1lcmljKHRoaXMucGVlaygpKSkge1xuICAgICAgbmFtZSArPSB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXG4gICAgICAgICdFeHBlY3RlZCB2YXJpYWJsZSBuYW1lIGFmdGVyICQnLFxuICAgICAgICB0aGlzLnBvc2l0aW9uLFxuICAgICAgICB0aGlzLmxpbmUsXG4gICAgICAgIHRoaXMuY29sdW1uLFxuICAgICAgICB0aGlzLmlucHV0XG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5WQVJJQUJMRSwgbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHNjYW5Db250ZXh0VmFyaWFibGUoKTogdm9pZCB7XG4gICAgbGV0IG5hbWUgPSAnJztcbiAgICB3aGlsZSAoIXRoaXMuaXNBdEVuZCgpICYmIHRoaXMuaXNBbHBoYU51bWVyaWModGhpcy5wZWVrKCkpKSB7XG4gICAgICBuYW1lICs9IHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgJ0V4cGVjdGVkIHZhcmlhYmxlIG5hbWUgYWZ0ZXIgQCcsXG4gICAgICAgIHRoaXMucG9zaXRpb24sXG4gICAgICAgIHRoaXMubGluZSxcbiAgICAgICAgdGhpcy5jb2x1bW4sXG4gICAgICAgIHRoaXMuaW5wdXRcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLkNPTlRFWFRfVkFSLCBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgc2NhblN0cmluZyhxdW90ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IHRoaXMucG9zaXRpb24gLSAxO1xuICAgIGxldCB2YWx1ZSA9ICcnO1xuXG4gICAgd2hpbGUgKCF0aGlzLmlzQXRFbmQoKSAmJiB0aGlzLnBlZWsoKSAhPT0gcXVvdGUpIHtcbiAgICAgIGlmICh0aGlzLnBlZWsoKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBpZiAoIXRoaXMuaXNBdEVuZCgpKSB7XG4gICAgICAgICAgY29uc3QgZXNjYXBlZCA9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICAgIHN3aXRjaCAoZXNjYXBlZCkge1xuICAgICAgICAgICAgY2FzZSAnbic6IHZhbHVlICs9ICdcXG4nOyBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3QnOiB2YWx1ZSArPSAnXFx0JzsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdyJzogdmFsdWUgKz0gJ1xccic7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnXFxcXCc6IHZhbHVlICs9ICdcXFxcJzsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdcIic6IHZhbHVlICs9ICdcIic7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIidcIjogdmFsdWUgKz0gXCInXCI7IGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDogdmFsdWUgKz0gZXNjYXBlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlICs9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQXRFbmQoKSkge1xuICAgICAgdGhyb3cgbmV3IFVudGVybWluYXRlZFN0cmluZ0Vycm9yKHN0YXJ0UG9zaXRpb24pO1xuICAgIH1cblxuICAgIHRoaXMuYWR2YW5jZSgpOyAvLyBDb25zdW1lIGNsb3NpbmcgcXVvdGVcbiAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5TVFJJTkcsIHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nhbk51bWJlcihmaXJzdENoYXI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHN0YXJ0UG9zaXRpb24gPSB0aGlzLnBvc2l0aW9uIC0gMTtcbiAgICBsZXQgbnVtU3RyID0gZmlyc3RDaGFyO1xuICAgIGxldCBpc0Zsb2F0ID0gZmFsc2U7XG5cbiAgICAvLyBJbnRlZ2VyIHBhcnRcbiAgICB3aGlsZSAoIXRoaXMuaXNBdEVuZCgpICYmIHRoaXMuaXNEaWdpdCh0aGlzLnBlZWsoKSkpIHtcbiAgICAgIG51bVN0ciArPSB0aGlzLmFkdmFuY2UoKTtcbiAgICB9XG5cbiAgICAvLyBEZWNpbWFsIHBhcnRcbiAgICBpZiAodGhpcy5wZWVrKCkgPT09ICcuJyAmJiB0aGlzLmlzRGlnaXQodGhpcy5wZWVrTmV4dCgpKSkge1xuICAgICAgbnVtU3RyICs9IHRoaXMuYWR2YW5jZSgpOyAvLyBjb25zdW1lICcuJ1xuICAgICAgd2hpbGUgKCF0aGlzLmlzQXRFbmQoKSAmJiB0aGlzLmlzRGlnaXQodGhpcy5wZWVrKCkpKSB7XG4gICAgICAgIG51bVN0ciArPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFeHBvbmVudCBwYXJ0XG4gICAgaWYgKHRoaXMucGVlaygpID09PSAnZScgfHwgdGhpcy5wZWVrKCkgPT09ICdFJykge1xuICAgICAgbnVtU3RyICs9IHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaWYgKHRoaXMucGVlaygpID09PSAnKycgfHwgdGhpcy5wZWVrKCkgPT09ICctJykge1xuICAgICAgICBudW1TdHIgKz0gdGhpcy5hZHZhbmNlKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNEaWdpdCh0aGlzLnBlZWsoKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWROdW1iZXJFcnJvcihudW1TdHIsIHN0YXJ0UG9zaXRpb24pO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCF0aGlzLmlzQXRFbmQoKSAmJiB0aGlzLmlzRGlnaXQodGhpcy5wZWVrKCkpKSB7XG4gICAgICAgIG51bVN0ciArPSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIH1cbiAgICAgIGlzRmxvYXQgPSB0cnVlOyAvLyBTY2llbnRpZmljIG5vdGF0aW9uIGlzIHRyZWF0ZWQgYXMgZmxvYXRcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZmxvYXQgc3VmZml4ICdmJ1xuICAgIGlmICh0aGlzLnBlZWsoKSA9PT0gJ2YnIHx8IHRoaXMucGVlaygpID09PSAnRicpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaXNGbG9hdCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGRlY2ltYWwgc3VmZml4ICdkJ1xuICAgIGlmICh0aGlzLnBlZWsoKSA9PT0gJ2QnIHx8IHRoaXMucGVlaygpID09PSAnRCcpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgaXNGbG9hdCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0Zsb2F0KSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQobnVtU3RyKTtcbiAgICAgIGlmIChpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWROdW1iZXJFcnJvcihudW1TdHIsIHN0YXJ0UG9zaXRpb24pO1xuICAgICAgfVxuICAgICAgdGhpcy5hZGRUb2tlbihUb2tlblR5cGUuTlVNQkVSLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFN0b3JlIGFzIHN0cmluZyB0byBwcmVzZXJ2ZSBwcmVjaXNpb24gZm9yIERlY2ltYWxcbiAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLk5VTUJFUiwgbnVtU3RyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjYW5JZGVudGlmaWVyKGZpcnN0Q2hhcjogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IG5hbWUgPSBmaXJzdENoYXI7XG5cbiAgICB3aGlsZSAoIXRoaXMuaXNBdEVuZCgpICYmIHRoaXMuaXNBbHBoYU51bWVyaWModGhpcy5wZWVrKCkpKSB7XG4gICAgICBuYW1lICs9IHRoaXMuYWR2YW5jZSgpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBrZXl3b3JkXG4gICAgY29uc3Qga2V5d29yZFR5cGUgPSBLRVlXT1JEU1tuYW1lXSB8fCBLRVlXT1JEU1tuYW1lLnRvVXBwZXJDYXNlKCldO1xuICAgIGlmIChrZXl3b3JkVHlwZSkge1xuICAgICAgaWYgKGtleXdvcmRUeXBlID09PSBUb2tlblR5cGUuQk9PTEVBTikge1xuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5CT09MRUFOLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0cnVlJyk7XG4gICAgICB9IGVsc2UgaWYgKGtleXdvcmRUeXBlID09PSBUb2tlblR5cGUuTlVMTCkge1xuICAgICAgICB0aGlzLmFkZFRva2VuKFRva2VuVHlwZS5OVUxMLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWRkVG9rZW4oa2V5d29yZFR5cGUsIG5hbWUudG9VcHBlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkVG9rZW4oVG9rZW5UeXBlLklERU5USUZJRVIsIG5hbWUpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,32 @@
1
+ import { ASTNode } from './types';
2
+ export declare class Parser {
3
+ private tokens;
4
+ private current;
5
+ private expression;
6
+ parse(expression: string): ASTNode;
7
+ private parseExpression;
8
+ private parsePrefixExpression;
9
+ private parseInfixExpression;
10
+ private parseNumber;
11
+ private parseString;
12
+ private parseBoolean;
13
+ private parseNull;
14
+ private parseVariable;
15
+ private parseContextVariable;
16
+ private parseIdentifierOrFunctionCall;
17
+ private parseFunctionCall;
18
+ private parseGroupedExpression;
19
+ private parseArrayLiteral;
20
+ private parseUnaryExpression;
21
+ private parseBinaryExpression;
22
+ private parseTernaryExpression;
23
+ private parseMemberAccess;
24
+ private parseIndexAccess;
25
+ private getPrecedence;
26
+ private getTokenPrecedence;
27
+ private getOperatorSymbol;
28
+ private peek;
29
+ private advance;
30
+ private isAtEnd;
31
+ private expect;
32
+ }