From e62b66dd08ca445d1f7e5b802a503ad3ec83b2df Mon Sep 17 00:00:00 2001 From: Melodi <62381002+Melodi17@users.noreply.github.com> Date: Fri, 8 Aug 2025 23:57:26 +1000 Subject: added branching to compiler and comment generation --- Compiler/CGrammar.g4 | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'Compiler/CGrammar.g4') 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 -- cgit v1.3.1