Home | History | Annotate | Download | only in functional
      1 grammar t047treeparser;
      2 options {
      3     language=JavaScript;
      4     output=AST;
      5 }
      6 
      7 tokens {
      8     VAR_DEF;
      9     ARG_DEF;
     10     FUNC_HDR;
     11     FUNC_DECL;
     12     FUNC_DEF;
     13     BLOCK;
     14 }
     15 
     16 program
     17     :   declaration+
     18     ;
     19 
     20 declaration
     21     :   variable
     22     |   functionHeader ';' -> ^(FUNC_DECL functionHeader)
     23     |   functionHeader block -> ^(FUNC_DEF functionHeader block)
     24     ;
     25 
     26 variable
     27     :   type declarator ';' -> ^(VAR_DEF type declarator)
     28     ;
     29 
     30 declarator
     31     :   ID 
     32     ;
     33 
     34 functionHeader
     35     :   type ID '(' ( formalParameter ( ',' formalParameter )* )? ')'
     36         -> ^(FUNC_HDR type ID formalParameter+)
     37     ;
     38 
     39 formalParameter
     40     :   type declarator -> ^(ARG_DEF type declarator)
     41     ;
     42 
     43 type
     44     :   'int'   
     45     |   'char'  
     46     |   'void'
     47     |   ID        
     48     ;
     49 
     50 block
     51     :   lc='{'
     52             variable*
     53             stat*
     54         '}'
     55         -> ^(BLOCK[$lc,"BLOCK"] variable* stat*)
     56     ;
     57 
     58 stat: forStat
     59     | expr ';'!
     60     | block
     61     | assignStat ';'!
     62     | ';'!
     63     ;
     64 
     65 forStat
     66     :   'for' '(' start=assignStat ';' expr ';' next=assignStat ')' block
     67         -> ^('for' $start expr $next block)
     68     ;
     69 
     70 assignStat
     71     :   ID EQ expr -> ^(EQ ID expr)
     72     ;
     73 
     74 expr:   condExpr
     75     ;
     76 
     77 condExpr
     78     :   aexpr ( ('=='^ | '<'^) aexpr )?
     79     ;
     80 
     81 aexpr
     82     :   atom ( '+'^ atom )*
     83     ;
     84 
     85 atom
     86     : ID      
     87     | INT      
     88     | '(' expr ')' -> expr
     89     ; 
     90 
     91 FOR : 'for' ;
     92 INT_TYPE : 'int' ;
     93 CHAR: 'char';
     94 VOID: 'void';
     95 
     96 ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
     97     ;
     98 
     99 INT :	('0'..'9')+
    100     ;
    101 
    102 EQ   : '=' ;
    103 EQEQ : '==' ;
    104 LT   : '<' ;
    105 PLUS : '+' ;
    106 
    107 WS  :   (   ' '
    108         |   '\t'
    109         |   '\r'
    110         |   '\n'
    111         )+
    112         { $channel=HIDDEN; }
    113     ;    
    114