blob: 4bb13425a745c2477cced1634ec2d2eea6377c99 (
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
125
126
127
128
129
130
131
132
133
|
grammar CGrammar;
options {
contextSuperClass = Q1.Compiler.Context;
}
HEX: '0x' [0-9a-fA-F]+;
ID: [a-zA-Z_][a-zA-Z0-9_]*;
INT: [0-9]+;
WS: [ \t\r\n]+ -> skip;
COMMENT: '//' .*? ([\n] | EOF) -> channel(HIDDEN);
DIRECTIVE: '#' .*? ([\n] | EOF) -> channel(HIDDEN);
LETTER: '\'' . '\'';
STRING: '"' .*? '"';
program
: function+ EOF
;
function
: rtype=type name=ID '(' ( types+=type params+=ID (',' types+=type params+=ID )* )? ')' ';' #functionPrototype
| rtype=type name=ID '(' ( types+=type params+=ID (',' types+=type params+=ID )* )? ')' block #functionDefinition
;
block
: '{' block_item* '}'
;
block_item
: statement
| declaration
;
statement
: 'return' expression ';' #returnStatement
| 'if' '(' expression ')' then=statement ('else' else=statement)? #ifStatement
| 'for' '(' (initializer=expression)? ';' cond=expression? ';' post=expression? ')' body=statement #forExprStatement
| 'for' '(' initializer=declaration cond=expression? ';' post=expression? ')' body=statement #forDeclStatement
| 'while' '(' cond=expression ')' body=statement #whileStatement
| 'do' body=statement 'while' '(' cond=expression ')' ';' #doWhileStatement
| 'break' ';' #breakStatement
| 'continue' ';' #continueStatement
| expression ';' #expressionStatement
| block #blockStatement
| ';' #nullStatement
;
declaration
: type name=ID ('=' value=expression)? ';' #variableDeclaration
;
expression
: '(' expression ')' #parenthesizedExpression
// | left=expression ',' right=expression #commaExpression
| 'new' type '[' INT? ']' ('{' ( params+=expression (',' params+=expression )* )? '}')? #arrayExpression
| constant #constantExpression
| target '=' expression #assignmentExpression
| '*' expression #dereferenceExpression
| '&' target #addressOfExpression
| ID #variableExpression
| ID '(' ( params+=expression (',' params+=expression )* )? ')' #callExpression
| obj=target '[' indexer=expression ']' #indexExpression
| '!' expression #notExpression
| '~' expression #invertExpression
| '++' target #incrementPrefixExpression
| '--' target #decrementPrefixExpression
| target '++' #incrementPostfixExpression
| target '--' #decrementPostfixExpression
| left=expression '*' right=expression #multiplyExpression
| left=expression '/' right=expression #divideExpression
| left=expression '%' right=expression #modulusExpression
| left=expression '+' right=expression #addExpression
| left=expression '-' right=expression #subtractExpression
| left=expression '<' right=expression #lessThanExpression
| left=expression '>' right=expression #greaterThanExpression
| left=expression '<=' right=expression #lessThanOrEqualExpression
| left=expression '>=' right=expression #greaterThanOrEqualExpression
| left=expression '==' right=expression #equalExpression
| left=expression '!=' right=expression #notEqualExpression
| left=expression '&' right=expression #bitwiseAndExpression
| left=expression '|' right=expression #bitwiseOrExpression
| left=expression '^' right=expression #bitwiseXorExpression
| left=expression '<<' right=expression #bitwiseLeftShiftExpression
| left=expression '>>' right=expression #bitwiseRightShiftExpression
| left=expression '&&' right=expression #logicalAndExpression
| left=expression '||' right=expression #logicalOrExpression
| target '*=' expression #compoundMultiplyExpression
| target '/=' expression #compoundDivideExpression
| target '%=' expression #compoundModulusExpression
| target '+=' expression #compoundAddExpression
| target '-=' expression #compoundSubtractExpression
| target '&=' expression #compoundBitwiseAndExpression
| target '|=' expression #compoundBitwiseOrExpression
| target '^=' expression #compoundBitwiseXorExpression
| target '<<=' expression #compoundBitwiseLeftShiftExpression
| target '>>=' expression #compoundBitwiseRightShiftExpression
| cond=expression '?' then=expression ':' else=expression #ternaryExpression
;
constant
: INT # intConstant
| HEX # hexConstant
| LETTER # charConstant
| STRING # stringConstant
;
type
: 'int'
| 'char'
| type '*'
;
target
: ID # variableTarget
| obj=target '[' indexer=expression ']' #indexerTarget
;
|