/
cka.g4
113 lines (95 loc) · 2 KB
/
cka.g4
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
grammar cka;
//basic CK
file
: instructions? EOF
;
instructions
: instruction ( instruction )*
;
instruction
: LABEL ':' #labelInst
| simpleInstruction #simpleInst
| literalIntMnemonic integer #literalIntInst
| literalLabelMnemonic LABEL #literalLabelInst
| literalStringMnemonic STRING #literalStringInst
| 'layout' frameLayout #layoutInst
| 'alloc' allocLayout #allocInst
| 'ncall' ID #ncallInst
;
literalLabelMnemonic
: 'push'
| 'jump'
| 'jumpz'
| 'jumpnz'
;
literalIntMnemonic
: 'push'
| 'aload'
| 'astore'
| 'lload'
| 'lstore'
| 'rload'
| 'rstore'
| 'cload'
| 'cstore'
;
literalStringMnemonic
: 'debugpush'
;
simpleInstruction
: 'add'
| 'sub'
| 'mul'
| 'div'
| 'mod'
| 'shl'
| 'shr'
| 'neg'
| 'not'
| 'bitnot'
| 'bitand'
| 'bitxor'
| 'bitor'
| 'lt'
| 'lte'
| 'gt'
| 'gte'
| 'eq'
| 'neq'
| 'cmp'
| 'call'
| 'return'
| 'dup'
| 'pop'
| 'swap'
| 'enter'
| 'leave'
| 'nop'
| 'halt'
| 'load'
| 'store'
| 'rbarrier'
| 'wbarrier'
| 'debugpop'
| 'clear'
| 'goto'
;
frameLayout
: '[' ']' #emptyFrameLayout
| '[' NATURAL ( ',' NATURAL )* ']' #nonEmptyFrameLayout
;
allocLayout
: '[' '*' ']' #refArrayLayout
| '[' ']' #emptyCustomLayout
| '[' NATURAL ( ',' NATURAL )* ']' #customLayout
;
integer : '-'? NATURAL ;
NATURAL : ('0'..'9')+ ;
ID : ('_'|'a'..'z') ('_'|'0'..'9'|'a'..'z'|'A'..'Z')* ;
LABEL : ('A'..'Z') ('_'|'0'..'9'|'a'..'z'|'A'..'Z')* ;
STRING
: '"' ('\\' ('\\'|'\t'|'\r\n'|'\r'|'\n'|'"') | ~('\\'|'\t'|'\r'|'\n'|'"') )* '"'
;
//NL : '\n'|'\r\n' ;
WHITESPACE : (' '|'\t'|'\u000C'|'\n'|'\r\n') -> skip ;
COMMENT : '//' ~('\n'|'\r')* '\r'? '\n' -> skip ;