@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.
- package/README.md +132 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +47 -0
- package/dist/cli.js.map +1 -0
- package/dist/generator.d.ts +28 -0
- package/dist/generator.js +290 -0
- package/dist/generator.js.map +1 -0
- package/dist/grammarParser.d.ts +27 -0
- package/dist/grammarParser.js +73 -0
- package/dist/grammarParser.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +102 -0
- package/dist/parser.js +125 -0
- package/dist/parser.js.map +1 -0
- package/dist/tableParser.d.ts +16 -0
- package/dist/tableParser.js +59 -0
- package/dist/tableParser.js.map +1 -0
- package/dist/utils/Result.d.ts +9 -0
- package/dist/utils/Result.js +3 -0
- package/dist/utils/Result.js.map +1 -0
- package/dist/utils/Stack.d.ts +7 -0
- package/dist/utils/Stack.js +26 -0
- package/dist/utils/Stack.js.map +1 -0
- package/dist/utils/errorWindowBuilder.d.ts +2 -0
- package/dist/utils/errorWindowBuilder.js +20 -0
- package/dist/utils/errorWindowBuilder.js.map +1 -0
- package/example/LoLang/Features_Array_Methods.lol +31 -0
- package/example/LoLang/example.ts +214 -0
- package/example/LoLang/grammar.txt +149 -0
- package/example/LoLang/table.txt +497 -0
- package/example/math/example.ts +49 -0
- package/example/math/grammar.txt +11 -0
- package/example/math/table.txt +22 -0
- package/package.json +36 -0
- package/src/cli.ts +49 -0
- package/src/generator.ts +394 -0
- package/src/grammarParser.ts +97 -0
- package/src/index.ts +12 -0
- package/src/parser.ts +207 -0
- package/src/tableParser.ts +69 -0
- package/src/utils/Result.ts +3 -0
- package/src/utils/Stack.ts +23 -0
- package/src/utils/errorWindowBuilder.ts +23 -0
- 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>;
|