-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgrammar.bnf
52 lines (43 loc) · 1.25 KB
/
grammar.bnf
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
BASETY := 'w' | 'l' | 's' | 'd' # Base types
EXTTY := BASETY | 'b' | 'h' # Extended types
CONST :=
['-'] NUMBER # Decimal integer
| 's_' FP # Single-precision float
| 'd_' FP # Double-precision float
| $IDENT # Global symbol
TYPEDEF :=
# Regular type
'type' :IDENT '=' [ 'align' NUMBER ]
'{'
( EXTTY [ NUMBER ] ),
'}'
| # Opaque type
'type' :IDENT '=' 'align' NUMBER '{' NUMBER '}'
DATADEF :=
['export'] 'data' $IDENT '='
'{'
( EXTTY DATAITEM+
| 'z' NUMBER ),
'}'
DATAITEM :=
$IDENT [ '+' NUMBER ] # Symbol and offset
| '"' ... '"' # String
| CONST # Constant
FUNCDEF :=
['export'] 'function' [BASETY | :IDENT] $IDENT PARAMS
'{'
BLOCK+
'}'
PARAMS := '(' ( (BASETY | :IDENT) %IDENT ), ')'
BLOCK :=
@IDENT # Block label
PHI* # Phi instructions
INST* # Regular instructions
JUMP # Jump or return
JUMP :=
'jmp' @IDENT # Unconditional
| 'jnz' VAL, @IDENT, @IDENT # Conditional
| 'ret' [ VAL ] # Return
CALL := [ %IDENT '=' ( BASETY | :IDENT ) ] 'call' VAL PARAMS
PARAMS := '(' ( (BASETY | :IDENT) %IDENT ), ')'
PHI := %IDENT '=' BASETY 'phi' ( @IDENT VAL ),