@scinorandex/sparse 0.0.1

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 (46) hide show
  1. package/README.md +132 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +47 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/generator.d.ts +28 -0
  6. package/dist/generator.js +290 -0
  7. package/dist/generator.js.map +1 -0
  8. package/dist/grammarParser.d.ts +27 -0
  9. package/dist/grammarParser.js +73 -0
  10. package/dist/grammarParser.js.map +1 -0
  11. package/dist/index.d.ts +5 -0
  12. package/dist/index.js +15 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/parser.d.ts +102 -0
  15. package/dist/parser.js +125 -0
  16. package/dist/parser.js.map +1 -0
  17. package/dist/tableParser.d.ts +16 -0
  18. package/dist/tableParser.js +59 -0
  19. package/dist/tableParser.js.map +1 -0
  20. package/dist/utils/Result.d.ts +9 -0
  21. package/dist/utils/Result.js +3 -0
  22. package/dist/utils/Result.js.map +1 -0
  23. package/dist/utils/Stack.d.ts +7 -0
  24. package/dist/utils/Stack.js +26 -0
  25. package/dist/utils/Stack.js.map +1 -0
  26. package/dist/utils/errorWindowBuilder.d.ts +2 -0
  27. package/dist/utils/errorWindowBuilder.js +20 -0
  28. package/dist/utils/errorWindowBuilder.js.map +1 -0
  29. package/example/LoLang/Features_Array_Methods.lol +31 -0
  30. package/example/LoLang/example.ts +214 -0
  31. package/example/LoLang/grammar.txt +149 -0
  32. package/example/LoLang/table.txt +497 -0
  33. package/example/math/example.ts +49 -0
  34. package/example/math/grammar.txt +11 -0
  35. package/example/math/table.txt +22 -0
  36. package/package.json +36 -0
  37. package/src/cli.ts +49 -0
  38. package/src/generator.ts +394 -0
  39. package/src/grammarParser.ts +97 -0
  40. package/src/index.ts +12 -0
  41. package/src/parser.ts +207 -0
  42. package/src/tableParser.ts +69 -0
  43. package/src/utils/Result.ts +3 -0
  44. package/src/utils/Stack.ts +23 -0
  45. package/src/utils/errorWindowBuilder.ts +23 -0
  46. package/tsconfig.json +30 -0
@@ -0,0 +1,214 @@
1
+ import fs from "fs/promises";
2
+ import { buildProductions, LR1StackSymbol, Sparse } from "../../src/index";
3
+ import { ColumnAndRow, Slex, Token } from "@scinorandex/slex";
4
+
5
+ // prettier-ignore
6
+ enum LoLangTokenType {
7
+ EOF,
8
+
9
+ IMPORT,
10
+ VARIABLE, CONSTANT,
11
+ FUNCTION, OBJECT,
12
+
13
+ RETURN,
14
+
15
+ TRY, CATCH, THROW,
16
+ IF, ELSE, ELIF,
17
+ SWITCH, DEFAULT, CASE, SWITCH_BREAK, SWITCH_GOTO,
18
+
19
+ FOR, OF, WHILE, LOOP_BREAK, LOOP_CONTINUE,
20
+ IDENTIFIER,
21
+ NUMBER_TYPE, BOOLEAN_TYPE, STRING_TYPE, VOID_TYPE,
22
+
23
+ L_PAREN, R_PAREN, L_CURLY_BRACE, R_CURLY_BRACE, L_BRACE, R_BRACE,
24
+ EQUALS, COMMA, MINUS_R_ANGLE_BAR, DOT, COLON, SEMICOLON,
25
+
26
+ // LOGICAL AND BITWISE OPERATORS
27
+ EXCLAMATION, DOUBLE_AMPERSAND, DOUBLE_PIPE, CARAT, AMPERSAND, PIPE,
28
+
29
+ // RELATIONAL AND EQUALITY OPERATORS
30
+ DOUBLE_EQUALS, EXCLAMATION_EQUALS, L_ANGLE_BAR, R_ANGLE_BAR, L_ANGLE_BAR_EQUALS, R_ANGLE_BAR_EQUALS,
31
+
32
+ // SHIFTING OPERATORS
33
+ DOUBLE_L_ANGLE_BAR, DOUBLE_R_ANGLE_BAR,
34
+
35
+ // ARITHMETIC OPERATORS
36
+ PLUS, MINUS, STAR, FORWARD_SLASH, PERCENT, DOUBLE_STAR,
37
+
38
+ // INCREMENTATION OPERATOR
39
+ DOUBLE_PLUS, DOUBLE_MINUS,
40
+
41
+ STRING_LITERAL, NUMBER_LITERAL, BOOLEAN_LITERAL, NULL_LITERAL
42
+ }
43
+
44
+ const lexerGenerator = new Slex<LoLangTokenType, {}>({
45
+ EOF_TYPE: LoLangTokenType.EOF,
46
+ isHigherPrecedence: ({ current, next }) => current === LoLangTokenType.IDENTIFIER,
47
+ });
48
+ {
49
+ lexerGenerator.addRule("plus", "$+", LoLangTokenType.PLUS);
50
+ lexerGenerator.addRule("minus", "$-", LoLangTokenType.MINUS);
51
+ lexerGenerator.addRule("star", "$*", LoLangTokenType.STAR);
52
+ lexerGenerator.addRule("forward_slash", "$/", LoLangTokenType.FORWARD_SLASH);
53
+ lexerGenerator.addRule("percent", "$%", LoLangTokenType.PERCENT);
54
+ lexerGenerator.addRule("double_star", "$*$*", LoLangTokenType.DOUBLE_STAR);
55
+ lexerGenerator.addRule("double_plus", "$+$+", LoLangTokenType.DOUBLE_PLUS);
56
+ lexerGenerator.addRule("double_minus", "$-$-", LoLangTokenType.DOUBLE_MINUS);
57
+
58
+ lexerGenerator.addRule("double_l_angle_bar", "$>$>", LoLangTokenType.DOUBLE_L_ANGLE_BAR);
59
+ lexerGenerator.addRule("double_r_angle_bar", "$<$<", LoLangTokenType.DOUBLE_R_ANGLE_BAR);
60
+ lexerGenerator.addRule("pipe", "$|", LoLangTokenType.PIPE);
61
+ lexerGenerator.addRule("ampersand", "$&", LoLangTokenType.AMPERSAND);
62
+ lexerGenerator.addRule("carat", "$^", LoLangTokenType.CARAT);
63
+
64
+ lexerGenerator.addRule("l_angle_bar", "$<", LoLangTokenType.L_ANGLE_BAR);
65
+ lexerGenerator.addRule("l_angle_bar_equals", "$<$=", LoLangTokenType.L_ANGLE_BAR_EQUALS);
66
+ lexerGenerator.addRule("r_angle_bar", "$>", LoLangTokenType.R_ANGLE_BAR);
67
+ lexerGenerator.addRule("r_angle_bar_equals", "$>$=", LoLangTokenType.R_ANGLE_BAR_EQUALS);
68
+ lexerGenerator.addRule("exclamation_equals", "$!$=", LoLangTokenType.EXCLAMATION_EQUALS);
69
+ lexerGenerator.addRule("double_equals", "$=$=", LoLangTokenType.DOUBLE_EQUALS);
70
+
71
+ lexerGenerator.addRule("double_ampersand", "$&$&", LoLangTokenType.DOUBLE_AMPERSAND);
72
+ lexerGenerator.addRule("double_pipe", "$|$|", LoLangTokenType.DOUBLE_PIPE);
73
+ lexerGenerator.addRule("exclamation", "$!", LoLangTokenType.EXCLAMATION);
74
+
75
+ lexerGenerator.addRule("minus_r_angle_bar", "$-$>", LoLangTokenType.MINUS_R_ANGLE_BAR);
76
+ lexerGenerator.addRule("equals", "$=", LoLangTokenType.EQUALS);
77
+ lexerGenerator.addRule("comma", "$,", LoLangTokenType.COMMA);
78
+ lexerGenerator.addRule("dot", "$.", LoLangTokenType.DOT);
79
+ lexerGenerator.addRule("colon", "$:", LoLangTokenType.COLON);
80
+ lexerGenerator.addRule("semicolon", "$;", LoLangTokenType.SEMICOLON);
81
+
82
+ lexerGenerator.addRule("l_paren", "$(", LoLangTokenType.L_PAREN);
83
+ lexerGenerator.addRule("r_paren", "$)", LoLangTokenType.R_PAREN);
84
+ lexerGenerator.addRule("l_brace", "$[", LoLangTokenType.L_BRACE);
85
+ lexerGenerator.addRule("r_brace", "$]", LoLangTokenType.R_BRACE);
86
+ lexerGenerator.addRule("l_curly_brace", "${", LoLangTokenType.L_CURLY_BRACE);
87
+ lexerGenerator.addRule("r_curly_brace", "$}", LoLangTokenType.R_CURLY_BRACE);
88
+
89
+ lexerGenerator.addRule("lowercase", "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z");
90
+ lexerGenerator.addRule("uppercase", "A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z");
91
+ lexerGenerator.addRule("letter", "${lowercase}|${uppercase}");
92
+ lexerGenerator.addRule(
93
+ "symbols",
94
+ "$ | $! | $@ | $# | $$ | $% | $^ | $& | $* | $( | $) | ${ | $[ | $} | $] | $; | $: | $< | $, | $. | $> | $? | $/ | $` | $~ | $- | $_ | $+ | $= | $|"
95
+ );
96
+ lexerGenerator.addRule("escape_character", "$\\ | $\n | $\t | $\r | $\\$\" | $\\$'");
97
+ lexerGenerator.addRule("digit", "0|1|2|3|4|5|6|7|8|9");
98
+ lexerGenerator.addRule("character", "${letter}|${digit}|${symbols}|${escape_character}");
99
+
100
+ lexerGenerator.addRule("float_number", "(${digit})+$.(${digit})+");
101
+ lexerGenerator.addRule("decimal_number", "(${digit})+");
102
+ lexerGenerator.addRule("octal_number", "0e(0|1|2|3|4|5|6|7)+");
103
+ lexerGenerator.addRule("hexadecimal_number", "0x(${digit}|a|b|c|d|e|f|A|B|C|D|E|F)+");
104
+ lexerGenerator.addRule("binary_number", "0b(0|1)+");
105
+
106
+ // handle literal tokens
107
+ lexerGenerator.addRule(
108
+ "string_literal",
109
+ "$\"(${character} | $')*$\" | $'(${character} | $\")*$'",
110
+ LoLangTokenType.STRING_LITERAL,
111
+ (str) => str.substring(1, str.length - 1).replaceAll("\\n", "\n")
112
+ );
113
+ lexerGenerator.addRule(
114
+ "number_literal",
115
+ "${float_number}|${decimal_number}|${octal_number}|${binary_number}|${hexadecimal_number}",
116
+ LoLangTokenType.NUMBER_LITERAL
117
+ );
118
+ lexerGenerator.addRule("boolean_literal", "faker|shaker", LoLangTokenType.BOOLEAN_LITERAL);
119
+ lexerGenerator.addRule("null_literal", "cooldown", LoLangTokenType.NULL_LITERAL);
120
+
121
+ // handle identifier and reserved words
122
+ lexerGenerator.addRule("item", "item", LoLangTokenType.VARIABLE);
123
+ lexerGenerator.addRule("rune", "rune", LoLangTokenType.CONSTANT);
124
+ lexerGenerator.addRule("skill", "skill", LoLangTokenType.FUNCTION);
125
+ lexerGenerator.addRule("steal", "steal", LoLangTokenType.IMPORT);
126
+ lexerGenerator.addRule("build", "build", LoLangTokenType.OBJECT);
127
+ lexerGenerator.addRule("canwin", "canwin", LoLangTokenType.IF);
128
+ lexerGenerator.addRule("remake", "remake", LoLangTokenType.ELIF);
129
+ lexerGenerator.addRule("lose", "lose", LoLangTokenType.ELSE);
130
+ lexerGenerator.addRule("channel", "channel", LoLangTokenType.SWITCH);
131
+ lexerGenerator.addRule("teleport", "teleport", LoLangTokenType.CASE);
132
+ lexerGenerator.addRule("recall", "recall", LoLangTokenType.DEFAULT);
133
+ lexerGenerator.addRule("flash", "flash", LoLangTokenType.SWITCH_GOTO);
134
+ lexerGenerator.addRule("cancel", "cancel", LoLangTokenType.SWITCH_BREAK);
135
+ lexerGenerator.addRule("wave", "wave", LoLangTokenType.WHILE);
136
+ lexerGenerator.addRule("cannon", "cannon", LoLangTokenType.FOR);
137
+ lexerGenerator.addRule("clear", "clear", LoLangTokenType.LOOP_BREAK);
138
+ lexerGenerator.addRule("next", "next", LoLangTokenType.LOOP_CONTINUE);
139
+ lexerGenerator.addRule("of", "of", LoLangTokenType.OF);
140
+ lexerGenerator.addRule("support", "support", LoLangTokenType.TRY);
141
+ lexerGenerator.addRule("carry", "carry", LoLangTokenType.CATCH);
142
+ lexerGenerator.addRule("feed", "feed", LoLangTokenType.THROW);
143
+ lexerGenerator.addRule("recast", "recast", LoLangTokenType.RETURN);
144
+
145
+ // handle type tokens
146
+ lexerGenerator.addRule("number_type", "stats", LoLangTokenType.NUMBER_TYPE);
147
+ lexerGenerator.addRule("boolean_type", "goat", LoLangTokenType.BOOLEAN_TYPE);
148
+ lexerGenerator.addRule("string_type", "message", LoLangTokenType.STRING_TYPE);
149
+ lexerGenerator.addRule("void_type", "passive", LoLangTokenType.VOID_TYPE);
150
+ lexerGenerator.addRule("identifier", "(${letter}|$_)(${letter}|${digit}|$_)*", LoLangTokenType.IDENTIFIER);
151
+ }
152
+
153
+ type StringifiedNode = (StringifiedNode | string)[];
154
+ class Node {
155
+ constructor(public readonly nodes: LR1StackSymbol<LoLangTokenType, {}, Node>[]) {}
156
+ toObject(): StringifiedNode {
157
+ return this.nodes.map((node) => (node.type === "token" ? node.token.lexeme : node.node.toObject()));
158
+ }
159
+ }
160
+
161
+ async function main() {
162
+ const exampleSourceCode = await fs.readFile("./example/LoLang/Features_Array_Methods.lol", "utf8");
163
+ const lexer = lexerGenerator.generate(exampleSourceCode, () => ({}));
164
+
165
+ const toStringifiedTokenType = (type: LoLangTokenType) => LoLangTokenType[type];
166
+ const productions = buildProductions(await fs.readFile("./example/LoLang/grammar.txt", "utf8"));
167
+ const parserGenerator = Sparse.fromProductions<LoLangTokenType, {}, Node>({ productions, toStringifiedTokenType });
168
+
169
+ const parser = parserGenerator.generate(lexer, {
170
+ reducer: (input, productionIndex) => new Node(input),
171
+ recover({ lexer, statesStack, symbolsStack, isSafe, addError, crash, finish, states }) {
172
+ let token = lexer.peekNextToken();
173
+ const currentState = statesStack.peek();
174
+
175
+ // check for extra semicolons
176
+ if (token.type === LoLangTokenType.SEMICOLON) {
177
+ while (lexer.peekNextToken().type === LoLangTokenType.SEMICOLON) token = lexer.getNextToken();
178
+ if (isSafe()) return finish();
179
+ }
180
+
181
+ token = lexer.peekNextToken();
182
+
183
+ // check for lacking semicolons
184
+ if (states[currentState].actions.has("[SEMICOLON]")) {
185
+ const action = states[currentState].getTerminalAction("SEMICOLON");
186
+ const newToken = new Token<LoLangTokenType, {}>(
187
+ LoLangTokenType.SEMICOLON,
188
+ ";",
189
+ new ColumnAndRow(token.column, token.line),
190
+ token.metadata
191
+ );
192
+
193
+ if (action) {
194
+ if (action.type === "reduce") return finish({ newToken });
195
+
196
+ statesStack.push(action.value);
197
+ symbolsStack.push({ type: "token", token: newToken });
198
+ addError(
199
+ `Expected SEMICOLON but received ${LoLangTokenType[token.type]}. SEMICOLON was automatically inserted.`
200
+ );
201
+ }
202
+
203
+ if (isSafe()) return finish();
204
+ }
205
+
206
+ console.log(lexer.peekNextToken());
207
+ return crash("Invalid syntax.");
208
+ },
209
+ });
210
+
211
+ console.log(parser.parse());
212
+ }
213
+
214
+ main();
@@ -0,0 +1,149 @@
1
+ <S> : <PROGRAM>;
2
+ <PROGRAM> : [EOF];
3
+ <PROGRAM> : <STATEMENT_LIST> [EOF];
4
+ <STATEMENT_LIST> : <STATEMENT_LIST> <STATEMENT>;
5
+ <STATEMENT_LIST> : <STATEMENT>;
6
+ <STATEMENT> : <IMPORT_STATEMENT>;
7
+ <STATEMENT> : <IF_STATEMENT>;
8
+ <STATEMENT> : <VARIABLE_DECLARATION_STATEMENT>;
9
+ <STATEMENT> : <CONSTANT_DECLARATION>;
10
+ <STATEMENT> : <BLOCK_STATEMENT>;
11
+ <STATEMENT> : <RETURN_STATEMENT>;
12
+ <STATEMENT> : <TRY_CATCH_STATEMENT>;
13
+ <STATEMENT> : <THROW_STATEMENT>;
14
+ <STATEMENT> : <SWITCH_STATEMENT>;
15
+ <STATEMENT> : <LOOP_STATEMENT>;
16
+ <STATEMENT> : <EXPRESSION_STATEMENT>;
17
+ <STATEMENT> : <OBJECT_TYPE_DECLARATION>;
18
+ <STATEMENT> : [SWITCH_BREAK] [SEMICOLON];
19
+ <STATEMENT> : [SWITCH_GOTO] [STRING_LITERAL] [SEMICOLON];
20
+ <STATEMENT> : [SWITCH_GOTO] [NUMBER_LITERAL] [SEMICOLON];
21
+ <STATEMENT> : [LOOP_BREAK] [SEMICOLON];
22
+ <STATEMENT> : [LOOP_CONTINUE] [SEMICOLON];
23
+ <IMPORT_STATEMENT> : [IMPORT] [STRING_LITERAL] [SEMICOLON];
24
+ <IF_STATEMENT> : [IF] [L_PAREN] <EXPRESSION> [R_PAREN] <STATEMENT> <ELSE_IF_STATEMENTS> [ELSE] <STATEMENT>;
25
+ <IF_STATEMENT> : [IF] [L_PAREN] <EXPRESSION> [R_PAREN] <STATEMENT> <ELSE_IF_STATEMENTS>;
26
+ <IF_STATEMENT> : [IF] [L_PAREN] <EXPRESSION> [R_PAREN] <STATEMENT> [ELSE] <STATEMENT>;
27
+ <IF_STATEMENT> : [IF] [L_PAREN] <EXPRESSION> [R_PAREN] <STATEMENT>;
28
+ <ELSE_IF_STATEMENTS> : <ELSE_IF_STATEMENTS> <ELSE_IF_STATEMENT>;
29
+ <ELSE_IF_STATEMENTS> : <ELSE_IF_STATEMENT>;
30
+ <ELSE_IF_STATEMENT> : [ELIF] [L_PAREN] <EXPRESSION> [R_PAREN] <STATEMENT>;
31
+ <VARIABLE_DECLARATION_STATEMENT> : <VARIABLE_DECLARATION> [SEMICOLON];
32
+ <VARIABLE_DECLARATION> : <VARIABLE_DECLARATION_HEADER>;
33
+ <VARIABLE_DECLARATION> : <VARIABLE_DECLARATION_HEADER> [EQUALS] <EXPRESSION>;
34
+ <VARIABLE_DECLARATION_HEADER> : [VARIABLE] [IDENTIFIER] [COLON] <TYPE>;
35
+ <CONSTANT_DECLARATION> : [CONSTANT] [IDENTIFIER] [COLON] <TYPE> [EQUALS] <EXPRESSION> [SEMICOLON];
36
+ <BLOCK_STATEMENT> : [L_CURLY_BRACE] [R_CURLY_BRACE];
37
+ <BLOCK_STATEMENT> : [L_CURLY_BRACE] <STATEMENT_LIST> [R_CURLY_BRACE];
38
+ <RETURN_STATEMENT> : [RETURN] <EXPRESSION> [SEMICOLON];
39
+ <RETURN_STATEMENT> : [RETURN] [SEMICOLON];
40
+ <TRY_CATCH_STATEMENT> : [TRY] <BLOCK_STATEMENT> [CATCH] [L_PAREN] [IDENTIFIER] [R_PAREN] <BLOCK_STATEMENT>;
41
+ <THROW_STATEMENT> : [THROW] [STRING_LITERAL] [SEMICOLON];
42
+ <SWITCH_STATEMENT> : [SWITCH] [L_PAREN] <EXPRESSION> [R_PAREN] [L_CURLY_BRACE] <SWITCH_CASE_LIST_WITH_DEFAULT> [R_CURLY_BRACE];
43
+ <SWITCH_STATEMENT> : [SWITCH] [L_PAREN] <EXPRESSION> [R_PAREN] [L_CURLY_BRACE] [R_CURLY_BRACE];
44
+ <SWITCH_CASE_LIST_WITH_DEFAULT> : <SWITCH_CASE_LIST> [DEFAULT] [COLON] <BLOCK_STATEMENT>;
45
+ <SWITCH_CASE_LIST_WITH_DEFAULT> : [DEFAULT] [COLON] <BLOCK_STATEMENT>;
46
+ <SWITCH_CASE_LIST_WITH_DEFAULT> : <SWITCH_CASE_LIST>;
47
+ <SWITCH_CASE_LIST> : <SWITCH_CASE_LIST> <SWITCH_CASE>;
48
+ <SWITCH_CASE_LIST> : <SWITCH_CASE>;
49
+ <SWITCH_CASE> : [CASE] [L_PAREN] [STRING_LITERAL] [R_PAREN] [COLON] <BLOCK_STATEMENT>;
50
+ <SWITCH_CASE> : [CASE] [L_PAREN] [NUMBER_LITERAL] [R_PAREN] [COLON] <BLOCK_STATEMENT>;
51
+ <LOOP_STATEMENT> : <FOREACH_LOOP>;
52
+ <LOOP_STATEMENT> : <COUNTER_CONTROLLED_LOOP>;
53
+ <LOOP_STATEMENT> : <WHILE_LOOP>;
54
+ <FOREACH_LOOP> : [FOR] [L_PAREN] [VARIABLE] [IDENTIFIER] [COLON] <TYPE> [OF] <EXPRESSION> [R_PAREN] <BLOCK_STATEMENT>;
55
+ <COUNTER_CONTROLLED_LOOP> : [FOR] [L_PAREN] <COUNTER_LOOP_INIT> [SEMICOLON] <EXPRESSION> [SEMICOLON] <EXPRESSION_LIST> [R_PAREN] <BLOCK_STATEMENT>;
56
+ <COUNTER_CONTROLLED_LOOP> : [FOR] [L_PAREN] [SEMICOLON] <EXPRESSION> [SEMICOLON] <EXPRESSION_LIST> [R_PAREN] <BLOCK_STATEMENT>;
57
+ <COUNTER_CONTROLLED_LOOP> : [FOR] [L_PAREN] <COUNTER_LOOP_INIT> [SEMICOLON] [SEMICOLON] <EXPRESSION_LIST> [R_PAREN] <BLOCK_STATEMENT>;
58
+ <COUNTER_CONTROLLED_LOOP> : [FOR] [L_PAREN] <COUNTER_LOOP_INIT> [SEMICOLON] <EXPRESSION> [SEMICOLON] [R_PAREN] <BLOCK_STATEMENT>;
59
+ <COUNTER_CONTROLLED_LOOP> : [FOR] [L_PAREN] [SEMICOLON] [SEMICOLON] <EXPRESSION_LIST> [R_PAREN] <BLOCK_STATEMENT>;
60
+ <COUNTER_CONTROLLED_LOOP> : [FOR] [L_PAREN] <COUNTER_LOOP_INIT> [SEMICOLON] [SEMICOLON] [R_PAREN] <BLOCK_STATEMENT>;
61
+ <COUNTER_CONTROLLED_LOOP> : [FOR] [L_PAREN] [SEMICOLON] <EXPRESSION> [SEMICOLON] [R_PAREN] <BLOCK_STATEMENT>;
62
+ <COUNTER_CONTROLLED_LOOP> : [FOR] [L_PAREN] [SEMICOLON] [SEMICOLON] [R_PAREN] <BLOCK_STATEMENT>;
63
+ <COUNTER_LOOP_INIT> : <VARIABLE_DECLARATION> [COMMA] <COUNTER_LOOP_INIT>;
64
+ <COUNTER_LOOP_INIT> : <VARIABLE_DECLARATION>;
65
+ <EXPRESSION_LIST> : <EXPRESSION> [COMMA] <EXPRESSION_LIST>;
66
+ <EXPRESSION_LIST> : <EXPRESSION>;
67
+ <WHILE_LOOP> : [WHILE] [L_PAREN] <EXPRESSION> [R_PAREN] <BLOCK_STATEMENT>;
68
+ <WHILE_LOOP> : [WHILE] [L_PAREN] [R_PAREN] <BLOCK_STATEMENT>;
69
+ <EXPRESSION_STATEMENT> : <EXPRESSION> [SEMICOLON];
70
+ <EXPRESSION> : <FUNCTION_EXPRESSION>;
71
+ <EXPRESSION> : <ARRAY_LITERAL>;
72
+ <EXPRESSION> : <OBJECT_LITERAL>;
73
+ <EXPRESSION> : <LOGICAL_EXPRESSION>;
74
+ <FUNCTION_EXPRESSION> : [FUNCTION] [L_PAREN] <PARAMETER_LIST> [R_PAREN] [COLON] <TYPE> [MINUS_R_ANGLE_BAR] <BLOCK_STATEMENT>;
75
+ <FUNCTION_EXPRESSION> : [FUNCTION] [L_PAREN] [R_PAREN] [COLON] <TYPE> [MINUS_R_ANGLE_BAR] <BLOCK_STATEMENT>;
76
+ <PARAMETER_LIST> : <VARIABLE_DECLARATION_HEADER> [COMMA] <PARAMETER_LIST>;
77
+ <PARAMETER_LIST> : <VARIABLE_DECLARATION_HEADER>;
78
+ <ARRAY_LITERAL> : [L_BRACE] <EXPRESSION_LIST> [R_BRACE];
79
+ <ARRAY_LITERAL> : [L_BRACE] [R_BRACE];
80
+ <OBJECT_LITERAL> : [L_CURLY_BRACE] <OBJECT_LITERAL_FIELD_LIST> [R_CURLY_BRACE];
81
+ <OBJECT_LITERAL> : [L_CURLY_BRACE] [R_CURLY_BRACE];
82
+ <OBJECT_LITERAL_FIELD_LIST> : <OBJECT_LITERAL_FIELD> [COMMA] <OBJECT_LITERAL_FIELD_LIST>;
83
+ <OBJECT_LITERAL_FIELD_LIST> : <OBJECT_LITERAL_FIELD>;
84
+ <OBJECT_LITERAL_FIELD> : [IDENTIFIER] [COLON] <EXPRESSION>;
85
+ <LOGICAL_EXPRESSION> : <LOGICAL_EXPRESSION> [DOUBLE_AMPERSAND] <BITWISE_EXPRESSION>;
86
+ <LOGICAL_EXPRESSION> : <LOGICAL_EXPRESSION> [DOUBLE_PIPE] <BITWISE_EXPRESSION>;
87
+ <LOGICAL_EXPRESSION> : <BITWISE_EXPRESSION>;
88
+ <BITWISE_EXPRESSION> : <BITWISE_EXPRESSION> [CARAT] <EQUALITY_EXPRESSION>;
89
+ <BITWISE_EXPRESSION> : <BITWISE_EXPRESSION> [AMPERSAND] <EQUALITY_EXPRESSION>;
90
+ <BITWISE_EXPRESSION> : <BITWISE_EXPRESSION> [PIPE] <EQUALITY_EXPRESSION>;
91
+ <BITWISE_EXPRESSION> : <EQUALITY_EXPRESSION>;
92
+ <EQUALITY_EXPRESSION> : <RELATIONAL_EXPRESSION> [DOUBLE_EQUALS] <RELATIONAL_EXPRESSION>;
93
+ <EQUALITY_EXPRESSION> : <RELATIONAL_EXPRESSION> [EXCLAMATION_EQUALS] <RELATIONAL_EXPRESSION>;
94
+ <EQUALITY_EXPRESSION> : <RELATIONAL_EXPRESSION>;
95
+ <RELATIONAL_EXPRESSION> : <SHIFT_EXPRESSION> [L_ANGLE_BAR] <SHIFT_EXPRESSION>;
96
+ <RELATIONAL_EXPRESSION> : <SHIFT_EXPRESSION> [L_ANGLE_BAR_EQUALS] <SHIFT_EXPRESSION>;
97
+ <RELATIONAL_EXPRESSION> : <SHIFT_EXPRESSION> [R_ANGLE_BAR] <SHIFT_EXPRESSION>;
98
+ <RELATIONAL_EXPRESSION> : <SHIFT_EXPRESSION> [R_ANGLE_BAR_EQUALS] <SHIFT_EXPRESSION>;
99
+ <RELATIONAL_EXPRESSION> : <SHIFT_EXPRESSION>;
100
+ <SHIFT_EXPRESSION> : <SHIFT_EXPRESSION> [DOUBLE_L_ANGLE_BAR] <TERM_EXPRESSION>;
101
+ <SHIFT_EXPRESSION> : <SHIFT_EXPRESSION> [DOUBLE_R_ANGLE_BAR] <TERM_EXPRESSION>;
102
+ <SHIFT_EXPRESSION> : <TERM_EXPRESSION>;
103
+ <TERM_EXPRESSION> : <TERM_EXPRESSION> [PLUS] <FACTOR_EXPRESSION>;
104
+ <TERM_EXPRESSION> : <TERM_EXPRESSION> [MINUS] <FACTOR_EXPRESSION>;
105
+ <TERM_EXPRESSION> : <FACTOR_EXPRESSION>;
106
+ <FACTOR_EXPRESSION> : <FACTOR_EXPRESSION> [STAR] <UNARY_EXPRESSION>;
107
+ <FACTOR_EXPRESSION> : <FACTOR_EXPRESSION> [FORWARD_SLASH] <UNARY_EXPRESSION>;
108
+ <FACTOR_EXPRESSION> : <FACTOR_EXPRESSION> [PERCENT] <UNARY_EXPRESSION>;
109
+ <FACTOR_EXPRESSION> : <UNARY_EXPRESSION>;
110
+ <UNARY_EXPRESSION> : [MINUS] <EXPONENTIATION_EXPRESSION>;
111
+ <UNARY_EXPRESSION> : [EXCLAMATION] <EXPONENTIATION_EXPRESSION>;
112
+ <UNARY_EXPRESSION> : <EXPONENTIATION_EXPRESSION>;
113
+ <EXPONENTIATION_EXPRESSION> : <ENDPOINT> [DOUBLE_STAR] <EXPONENTIATION_EXPRESSION>;
114
+ <EXPONENTIATION_EXPRESSION> : <ENDPOINT>;
115
+ <ENDPOINT> : <ASSIGNMENT_EXPRESSION>;
116
+ <ENDPOINT> : <LITERAL>;
117
+ <ENDPOINT> : <GROUPING_EXPRESSION>;
118
+ <ASSIGNMENT_EXPRESSION> : <IDENTIFIER_STACK_EXPRESSION> [DOUBLE_PLUS];
119
+ <ASSIGNMENT_EXPRESSION> : <IDENTIFIER_STACK_EXPRESSION> [DOUBLE_MINUS];
120
+ <ASSIGNMENT_EXPRESSION> : [DOUBLE_PLUS] <IDENTIFIER_STACK_EXPRESSION>;
121
+ <ASSIGNMENT_EXPRESSION> : [DOUBLE_MINUS] <IDENTIFIER_STACK_EXPRESSION>;
122
+ <ASSIGNMENT_EXPRESSION> : <IDENTIFIER_STACK_EXPRESSION> [EQUALS] <EXPRESSION>;
123
+ <ASSIGNMENT_EXPRESSION> : <IDENTIFIER_STACK_EXPRESSION>;
124
+ <IDENTIFIER_STACK_EXPRESSION> : [IDENTIFIER];
125
+ <IDENTIFIER_STACK_EXPRESSION> : <IDENTIFIER_STACK_EXPRESSION> [DOT] [IDENTIFIER];
126
+ <IDENTIFIER_STACK_EXPRESSION> : <IDENTIFIER_STACK_EXPRESSION> [L_BRACE] <EXPRESSION> [R_BRACE];
127
+ <IDENTIFIER_STACK_EXPRESSION> : <IDENTIFIER_STACK_EXPRESSION> [L_PAREN] <EXPRESSION_LIST> [R_PAREN];
128
+ <IDENTIFIER_STACK_EXPRESSION> : <IDENTIFIER_STACK_EXPRESSION> [L_PAREN] [R_PAREN];
129
+ <LITERAL> : [STRING_LITERAL];
130
+ <LITERAL> : [NUMBER_LITERAL];
131
+ <LITERAL> : [BOOLEAN_LITERAL];
132
+ <LITERAL> : [NULL_LITERAL];
133
+ <GROUPING_EXPRESSION> : [L_PAREN] <EXPRESSION> [R_PAREN];
134
+ <OBJECT_TYPE_DECLARATION> : [OBJECT] [IDENTIFIER] [L_CURLY_BRACE] <PROPERTY_LIST> [R_CURLY_BRACE];
135
+ <OBJECT_TYPE_DECLARATION> : [OBJECT] [IDENTIFIER] [L_CURLY_BRACE] [R_CURLY_BRACE];
136
+ <PROPERTY_LIST> : <PROPERTY_LIST> <PROPERTY_DEFINITION>;
137
+ <PROPERTY_LIST> : <PROPERTY_DEFINITION>;
138
+ <PROPERTY_DEFINITION> : [IDENTIFIER] [COLON] <TYPE> [SEMICOLON];
139
+ <TYPE> : <TYPE> [L_BRACE] [R_BRACE];
140
+ <TYPE> : [NUMBER_TYPE];
141
+ <TYPE> : [BOOLEAN_TYPE];
142
+ <TYPE> : [STRING_TYPE];
143
+ <TYPE> : [VOID_TYPE];
144
+ <TYPE> : [OBJECT] [IDENTIFIER];
145
+ <TYPE> : <LAMBDA_TYPE>;
146
+ <LAMBDA_TYPE> : [FUNCTION] [L_PAREN] <LAMBDA_PARAMETER_LIST> [R_PAREN] [MINUS_R_ANGLE_BAR] <TYPE>;
147
+ <LAMBDA_TYPE> : [FUNCTION] [L_PAREN] [R_PAREN] [MINUS_R_ANGLE_BAR] <TYPE>;
148
+ <LAMBDA_PARAMETER_LIST> : <TYPE> [COMMA] <LAMBDA_PARAMETER_LIST>;
149
+ <LAMBDA_PARAMETER_LIST> : <TYPE>;