| grammar SimpleC; |
| options { |
| output=AST; |
| language=ObjC; |
| } |
| |
| tokens { |
| VAR_DEF; |
| ARG_DEF; |
| FUNC_HDR; |
| FUNC_DECL; |
| FUNC_DEF; |
| BLOCK; |
| } |
| |
| program |
| : declaration+ |
| ; |
| |
| declaration |
| : variable |
| | functionHeader K_SEMICOLON -> ^(FUNC_DECL functionHeader) |
| | functionHeader block -> ^(FUNC_DEF functionHeader block) |
| ; |
| |
| variable |
| : type declarator K_SEMICOLON -> ^(VAR_DEF type declarator) |
| ; |
| |
| declarator |
| : K_ID |
| ; |
| |
| functionHeader |
| : type K_ID K_LCURVE ( formalParameter ( K_COMMA formalParameter )* )? K_RCURVE |
| -> ^(FUNC_HDR type K_ID formalParameter+) |
| ; |
| |
| formalParameter |
| : type declarator -> ^(ARG_DEF type declarator) |
| ; |
| |
| type |
| : K_INT_TYPE |
| | K_CHAR |
| | K_VOID |
| | K_ID |
| ; |
| |
| block |
| : lc=K_LCURLY |
| variable* |
| stat* |
| K_RCURLY |
| -> ^(BLOCK[$lc,@"BLOCK"] variable* stat*) |
| ; |
| |
| stat: forStat |
| | expr K_SEMICOLON! |
| | block |
| | assignStat K_SEMICOLON! |
| | K_SEMICOLON! |
| ; |
| |
| forStat |
| : K_FOR K_LCURVE start=assignStat K_SEMICOLON expr K_SEMICOLON next=assignStat K_RCURVE block |
| -> ^(K_FOR $start expr $next block) |
| ; |
| |
| assignStat |
| : K_ID K_EQ expr -> ^(K_EQ K_ID expr) |
| ; |
| |
| expr: condExpr |
| ; |
| |
| condExpr |
| : aexpr ( (K_EQEQ^ | K_LT^) aexpr )? |
| ; |
| |
| aexpr |
| : atom ( K_PLUS^ atom )* |
| ; |
| |
| atom |
| : K_ID |
| | K_INT |
| | K_LCURVE expr K_RCURVE -> expr |
| ; |
| |
| K_FOR : 'for' ; |
| K_CHAR: 'char'; |
| K_INT_TYPE : 'int' ; |
| K_VOID: 'void'; |
| |
| K_ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')* |
| ; |
| |
| K_INT : anInt+=('0'..'9')+ {NSLog(@"\%@", $anInt);} |
| ; |
| |
| K_LCURVE : '('; |
| K_RCURVE : ')'; |
| K_PLUS : '+' ; |
| K_COMMA : ','; |
| K_SEMICOLON : ';'; |
| K_LT : '<' ; |
| K_EQ : '=' ; |
| K_EQEQ : '==' ; |
| K_LCURLY : '{'; |
| K_RCURLY : '}'; |
| |
| WS : ( ' ' |
| | '\t' |
| | '\r' |
| | '\n' |
| )+ |
| { $channel=HIDDEN; } |
| ; |