-
Notifications
You must be signed in to change notification settings - Fork 1
/
bnf.txt
94 lines (70 loc) · 3.05 KB
/
bnf.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
program ::= {importBlock} {blockStmt} [exportBlock]
blockStmt ::= block ';'
| stmt
block ::= '{' {blockStmt} '}'
importBlock ::= import <STRING|ID> {',' <STRING|ID>} [as ID {',' ID}] ';'
exportBlock ::= export exp ';'
stmt ::= | varDeclare ';' // declare variables
| varAssign ';' // variables assignment
| varIncOrDec ';'
| var '(' {explist} ')' callTail ';' // named function call
| ID ':' // label
| func ID funcBody ';' // function definition
| funcLiteral '(' [expList] ')' callTail ';' // anonymous function call
| break ';'
| continue ';'
| return [expList] ';'
| goto ID ';'
| fallthrough ';'
| loop '(' let ID [',' ID] ':' exp ')' blockStmt // iterator loop
| while expBlock blockStmt // while statement
| for '(' <varAssign|varDeclare> ';' exp ';' forTail ')' blockStmt // for statement
| if expBlock blockStmt {elif expBlock blockStmt} [else blockStmt]
| class ID '{' {classBody} '}' ';'
| enum '{' [enumBlocks] '}' ';'
| switch expBlock [';'] '{' caseBlocks '}'
| incOrDecVar ';'
| try '{' {blockStmt} '}' catch '{ {blockStmt} '}' finally '{' {blockStmt} '}'
varDeclare ::= <const|let> nameList '=' expList]
varAssign ::= var {',' var} assignOP expList
varIncOrDec ::= var <'++'|'--'>
incOrDecVar ::= <'++'|'--'> var
forTail ::= varAssign | varIncOrDec | incOrDecVar
callTail ::= { {attrTail} '(' {explist} ')' }
attrTail ::= '.' ID
| '[' exp ']'
varList ::= var {',' var}
var ::= ID {attrTail}
funcBody ::= '(' [parlist] ')' [';'] '{' {blockStmt} '}'
expBlock ::= '(' exp ')'
nameList ::= ID {,ID}
expList ::= exp {,exp}
exp ::= | '(' exp ')' | literal | nil | new ID ['(' [expList] ')'] | ID | unOP exp
| exp '--'
| exp '++'
| exp '.' ID
| exp '[' exp ']'
| exp binOP exp
| exp '?' exp ':' exp
| exp '(' [expList] ')'
classBody ::= | ID ['=' exp]
| ID funcBody
enumBlocks ::= enumBlock {',' enumBlock} [',']
enumBlock :: ID ['=' NUMBER]
caseBlocks ::= {caseBlock} [default ':' {block}]
caseBlock ::= case exp {',' exp} ':' {block}
parlist ::= par {',' par} ['...' ID] // function parameter
par ::= ID ['=' constLiteral]
literal ::= mapLiteral | constLiteral | arrLiteral | funcLiteral
mapLiteral ::= '{' [fields] '}'
fields ::= field {',' field} [',']
field ::= <constLiteral|ID> ':' exp
constLiteral ::= STRING | NUMBER | false | true
arrLiteral ::= '[' [expList] ']'
funcLiteral ::= func funcBody
binOP ::= '+' | '-' | '*' | '/' | '//' | '%' | '&' | '|'
| '^' | '>>' | '<<' | '<=' | '>=' | '<' | '>'
| '==' | '!=' | '&&' | '||'
unOP ::= '~' | '!' | '-' | '--' | '++'
assignOP ::= '=' | '+=' | '-=' | ':=' | '/=' | '*='
| '%=' | '&=' | '^=' | '|='