blob: a6d4df42cc0f979fff9f6926aa76b5b54a627bb8 (
plain)
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
114
115
116
117
118
119
120
121
122
123
124
|
# Grammar for Chapter 14
```antlrv4
grammar SimpleLanguage;
program : block EOF ;
block : statement+ ;
statement
: '{' block '}'
| returnStatement
| ifStatement
| whileStatement
| breakStatement
| continueStatement
| metaStatement
| structDeclaration
| expressionStatement
;
returnStatement : 'return' expression ';' ;
ifStatement : 'if' '(' expression ')' statement ('else' statement)? ;
whileStatement : 'while' '(' expression ')' statement ;
breakStatement : 'break' ';' ;
continueStatement : 'continue' ';' ;
metaStatement : '#showGraph' ';' ;
structDeclaration : 'struct' IDENTIFIER '{' fields '}' ;
fields : field+ ;
field : type IDENTIFIER ';' ;
expressionStatement
: type IDENTIFIER ';'
| type IDENTIFIER '=' expression ';'
| IDENTIFIER '=' expression ';'
| expression
;
PRIMTYPE
: 'int'
| 'i8'
| 'i16'
| 'i32'
| 'i64'
| 'u8'
| 'u16'
| 'u32'
| 'flt'
| 'f32'
| 'f64'
| 'bool'
;
type
: PRIMTYPE
| typeName ('?')?
;
typeName : IDENTIFIER ;
expression : bitWiseExpression ;
bitWiseExpression
: comparisonExpression ( '&' | '|' | '^' ) comparisonExpression)*
;
comparisonExpression
: shiftExpression (('==' | '!='| '>'| '<'| '>='| '<=') shiftExpression)*
;
shiftExpression
: additiveExpression ( '<<' | '>>>' | '>>' ) additiveExpression)*
;
additiveExpression
: multiplicativeExpression (('+' | '-') multiplicativeExpression)*
;
multiplicativeExpression
: unaryExpression (('*' | '/') unaryExpression)*
;
unaryExpression
: ('-') unaryExpression
| '!' unaryExpression
| primaryExpression postFix*
;
primaryExpression
: INTEGER_LITERAL
| '(' expression ')'
| 'true'
| 'false'
| 'null'
| newExpression
| IDENTIFIER
;
newExpression : 'new' IDENTIFIER ;
postFix : '.' IDENTIFIER [ '=' expression ] ;
INTEGER_LITERAL
: [1-9]DIGIT*
| [0]
;
IDENTIFIER : NON_DIGIT (NON_DIGIT | DIGIT)* ;
NON_DIGIT: [a-zA-Z_];
DIGIT: [0-9];
```
|