-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrammar.txt
76 lines (60 loc) · 1.68 KB
/
grammar.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
statements
: NEWLINE* statement (NEWLINE+ statement)* NEWLINE*
statement
: KEYWORD:RETURN expr?
: KEYWORD:CONTINUE
: KEYWORD:BREAK
: expr
expr
: KEYWORD:VAR IDENTIFIER EQ expr
: comp-expr ((KEYWORD:AND|KEYWORD:OR) comp-expr)*
comp-expr
: NOT comp-expr
: arith-expr ((EE|GT|LT|GTE|LTE|NE) arith-expr)*
arith-expr
: term ((PLUS|MINUS) term)*
term
: factor ((MUL|DIV|QEDIV|MOD) factor)*
factor
: (PLUS|MINUS) factor
: power
power
: call (POW factor)*
call
: atom (LPAREN (expr (COMMA expr)*)? RPAREN)?
atom
: NUM|STRING|IDENTIFIER
: LPAREN expr RPAREN
: list-expr
: if-expr
: for-expr
: while-expr
: function-def
list-expr
: LSQUARE (expr (COMMA expr)*)? RSQUARE
if-expr
: KEYWORD:IF expr KEYWORD:THEN
(statement if-expr-b|if-expr-c?)
| (NEWLINE statements KEYWORD:END|if-expr-b|if-expr-c)
if-expr-b
: KEYWORD:ELIF expr KEYWORD:THEN
(statement if-expr-b|if-expr-c?)
| (NEWLINE statements KEYWORD:END|if-expr-b|if-expr-c)
if-expr-c
: KEYWORD:ELSE
statement
| (NEWLINE statements KEYWORD:END)
for-expr
: KEYWORD:FOR IDENTIFIER EQ expr KEYWORD:TO expr
(KEYWORD:STEP expr)? KEYWORD:THEN
statement
| (NEWLINE statements KEYWORD:END)
while-expr
: KEYWORD:WHILE expr THEN
statement
| (NEWLINE statements KEYWORD:END)
function-def
: KEYWORD:FUNCTION IDENTIFIER?
LPAREN (IDENTIFIER (COMMA IDENTIFIER)*)? RPAREN
(ARROW expr)
| (NEWLINE statements KEYWORD:END)