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
|
grammar t047treeparser;
options {
language=Python3;
output=AST;
}
tokens {
VAR_DEF;
ARG_DEF;
FUNC_HDR;
FUNC_DECL;
FUNC_DEF;
BLOCK;
}
program
: declaration+
;
declaration
: variable
| functionHeader ';' -> ^(FUNC_DECL functionHeader)
| functionHeader block -> ^(FUNC_DEF functionHeader block)
;
variable
: type declarator ';' -> ^(VAR_DEF type declarator)
;
declarator
: ID
;
functionHeader
: type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
-> ^(FUNC_HDR type ID formalParameter+)
;
formalParameter
: type declarator -> ^(ARG_DEF type declarator)
;
type
: 'int'
| 'char'
| 'void'
| ID
;
block
: lc='{'
variable*
stat*
'}'
-> ^(BLOCK[$lc,"BLOCK"] variable* stat*)
;
stat: forStat
| expr ';'!
| block
| assignStat ';'!
| ';'!
;
forStat
: 'for' '(' start=assignStat ';' expr ';' next=assignStat ')' block
-> ^('for' $start expr $next block)
;
assignStat
: ID EQ expr -> ^(EQ ID expr)
;
expr: condExpr
;
condExpr
: aexpr ( ('=='^ | '<'^) aexpr )?
;
aexpr
: atom ( '+'^ atom )*
;
atom
: ID
| INT
| '(' expr ')' -> expr
;
FOR : 'for' ;
INT_TYPE : 'int' ;
CHAR: 'char';
VOID: 'void';
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INT : ('0'..'9')+
;
EQ : '=' ;
EQEQ : '==' ;
LT : '<' ;
PLUS : '+' ;
WS : ( ' '
| '\t'
| '\r'
| '\n'
)+
{ $channel=HIDDEN }
;
|