summaryrefslogtreecommitdiff
path: root/Compiler/CGrammar.g4
diff options
context:
space:
mode:
Diffstat (limited to 'Compiler/CGrammar.g4')
-rw-r--r--Compiler/CGrammar.g459
1 files changed, 57 insertions, 2 deletions
diff --git a/Compiler/CGrammar.g4 b/Compiler/CGrammar.g4
index 69b2c0a..aec4694 100644
--- a/Compiler/CGrammar.g4
+++ b/Compiler/CGrammar.g4
@@ -2,25 +2,57 @@ grammar CGrammar;
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
- : 'int' ID '(' ')' '{' statement* '}'
+ : 'int' name=ID '(' ')' block
+ ;
+
+body
+ : statement
+ | block
+ ;
+
+block
+ : '{' block_item* '}'
+ ;
+
+block_item
+ : statement
+ | declaration
;
statement
: 'return' expression ';' #returnStatement
+ | 'if' '(' expression ')' then=body ('else' else=body) #ifStatement
+ | expression #expressionStatement
+ ;
+
+
+declaration
+ : 'int' name=ID ('=' value=expression)? ';' #variableDeclaration
;
expression
: '(' expression ')' #parenthesizedExpression
+ | constant #constantExpression
+ | target '=' expression ';' #assignmentExpression
+ | ID #variableExpression
| '!' 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
@@ -39,12 +71,35 @@ expression
| 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
- | constant #constantExpression
+ | 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
+
+ | left=expression ',' right=expression #commaExpression
+
+ | cond=expression '?' then=expression ':' else=expression #ternaryExpression
;
constant
: INT # intConstant
+ ;
+
+target
+ : ID # variableTarget
; \ No newline at end of file