summaryrefslogtreecommitdiff
path: root/Compiler/CGrammar.g4
blob: b0a03f71e9e8e136d94196cd6c6d9c2ee27bf2d7 (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
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);


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
    | constant #constantExpression
    | target '=' expression #assignmentExpression
    | '*' expression #dereferenceExpression
    | '&' target #addressOfExpression
    | ID #variableExpression
    
    | ID '(' ( params+=expression (',' params+=expression )* )? ')' #callExpression
    | obj=expression '[' 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
    ;
    
type
    : 'int' #intType
    | 'char' #charType
    | type '*' #pointerType
    ;
    
target
    : ID # variableTarget
    ;