-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWeakLangBNF
61 lines (52 loc) · 2.25 KB
/
WeakLangBNF
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
# This file is part of weak-lang.
# weak-lang is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# any later version.
# weak-lang is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
# You should have received a copy of the GNU Affero General Public License
# along with weak-lang. If not, see <https://www.gnu.org/licenses/>.
program := declaration* EOF
declaration := funDeclaration
|opDeclaration
|varDeclaration
|statement
funDeclaration := "f" IDENTIFIER "(" parameters? ")" block
opDeclaration := "o" IDENTIFIER "(" IDENTIFIER, IDENTIFIER ")" block
varDeclaration := "a" IDENTIFIER ( "=" expression )? ";"
parameters := IDENTIFIER ( "," IDENTIFIER )*
arguments := expression ( "," expression )*
statement := exprStatement
| ifStatement
| printStatement
| returnStatement
| whileStatement
| block
block := "{" declaration* "}";
exprStatement := expression ";"
ifStatement := "i" "(" expression ")" block
printStatement := "p" expression ";"
returnStatement := "r" expression? ";"
whileStatement := "w" "(" expression ")" block
assertStatement := "v" expression ";"
expression := assignment
assignment := IDENTIFIER ( "[" arguments "]" )? "=" assignment | operation
operation := logicOr ( IDENTIFIER logicOr )*
logicOr = logicAnd ( "O" logicAnd )*
logicAnd = equality ( "A" equality )*
equality := comparison( ("!=" | "==") comparison*
comparison := term ( ( ">" | "<") term *
term := factor ( ( "-" | "+" ) factor )*
factor := unary ( ( "/" | "*" | "@" | "sa" | "^" ) unary )*
unary := ( "!" | "-" | "s" ) unary | arrAccess
arrAccess := function "[" arguments "]" | function
function := IDENTIFIER "(" arguments? ")" | primary
primary := "T" | "F" | "N" | NUMBER | STRING | IDENTIFIER | "(" expression ")" | "[]" | "[" arguments "]"
NUMBER := DIGIT+ ( "." DIGIT+ )?
STRING := "\"" <any not "\"">* "\""
IDENTIFIER := ALPHA ( ALPHA | DIGIT )*
ALPHA := "a" ... "z" | "A" ... "Z" | "_"
DIGIT := "0" ... "9"