[antlr-interest] Older Grammar in ANTLR 3
Pennington, Elliot
elliot at WPI.EDU
Sat Oct 3 15:24:33 PDT 2009
Howdy All,
I've got an old grammar that used to work in ANTLR 2 but that now
fails in ANTLR 3. I'd like to make the switch, but I'm at a loss as to
how to fix this. For the following example code:
--------------
void input_a() {
integer a, bb, xyz, b3, c, p, q;
real b;
a = b3;
b = -2.5;
xyz = 2 + a + bb + c - p / q;
a = xyz * ( p + q );
p = a - xyz - p;
}
-------------
I get this tree result:
-------------
def
function_declaration
type
void
input_a
(
)
code_block
FailedPredicateException(code_block,{can't deal with predicates
yet}?)
FailedPredicateException(code_block,{synpred2_javalet}?)
------------
Here's the grammar I'm using. Has anyone seen anything like this
before for a grammar that worked in ANTLR 2? I'm not sure how to get
it to parse properly so I don't get the failed predicate exception.
Thanks,
Elliot
------------
grammar Javalet;
options {
backtrack = true;
output=AST;
ASTLabelType=CommonTree;
k=2;
}
tokens {
FUNCTION = 'function';
}
@header {package javalet.compiler;}
@lexer::header{package javalet.compiler;}
def : function_declaration
;
code_block
: '{' statement* '}' -> (statement)*
| statement
;
statement
: block_statement
| variable_declaration ';' -> variable_declaration
| assignment ';' -> assignment
;
block_statement
: IF '(' value_0 ')' code_block
(else_block)? -> ^(IF value_0 code_block (else_block)?)
| WHILE '(' value_0 ')' code_block -> ^(WHILE value_0 code_block)
;
else_block
: ELSE code_block -> ^(ELSE code_block)
;
assignment
: ID EQ value_0 -> ^(EQ ID value_0)
;
variable_declaration
: type ID (',' ID)* -> ^(type ID*)
;
function_declaration
: type ID '(' ')' code_block -> ^('function' type ID code_block)
;
operator_0
: LOGICAL_OR
;
LOGICAL_OR
: '||'
;
operator_1
: LOGICAL_AND
;
LOGICAL_AND
: '&&'
;
operator_2
: LOGICAL_EQUALITY
| LOGICAL_INEQUALITY
| LOGICAL_GREATER_THAN
| LOGICAL_LESS_THAN
| LOGICAL_GREATER_THAN_OR_EQUAL
| LOGICAL_LESS_THAN_OR_EQUAL
;
LOGICAL_EQUALITY
: '=='
;
LOGICAL_INEQUALITY
: '!='
;
LOGICAL_GREATER_THAN
: '>'
;
LOGICAL_LESS_THAN
: '<'
;
LOGICAL_GREATER_THAN_OR_EQUAL
: '>='
;
LOGICAL_LESS_THAN_OR_EQUAL
: '<='
;
operator_3
: ADD
| SUBTRACT
;
ADD : '+';
SUBTRACT: '-';
operator_4
: MULTIPLY
| DIVIDE
;
MULTIPLY: '*';
DIVIDE : '/';
value_0
: value_1 operator_0 value_0 -> ^(operator_0 value_1 value_0)
| value_1
;
value_1
: value_2 operator_1 value_1 -> ^(operator_1 value_2 value_1)
| value_2
;
value_2
: value_3 operator_2 value_2 -> ^(operator_2 value_3 value_2)
| value_3
;
value_3
: value_4 operator_3 value_3 -> ^(operator_3 value_4 value_3)
| value_4
;
value_4
: value_5 operator_4 value_4 -> ^(operator_4 value_5 value_4)
| value_5
;
value_5
: '(' value_0 ')' -> ^(value_0)
| num
;
num
: (REAL|INTEGER|ID)
;
WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
;
COMMENT : '/*' .* '*/' {$channel=HIDDEN;}
;
LINE_COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} ;
//fragment
IF : 'if' ;
//fragment
ELSE : 'else' ;
//fragment
WHILE : 'while' ;
//fragment
DO : 'do' ;
//fragment
FOR : 'for' ;
//fragment
EQ : '='
;
fragment
DIGIT : '0'..'9' ;
fragment
LETTER : ('a'..'z'|'A'..'Z') ;
type : TYPE_VOID
| TYPE_INTEGER
| TYPE_REAL
;
TYPE_VOID
: 'void'
;
TYPE_INTEGER
: 'integer'
;
TYPE_REAL
: 'real'
;
INTEGER : (DIGIT)+ ;
REAL : ('+'|'-') (DIGIT)+ '.' (DIGIT)+ ;
ID : LETTER ('_' | DIGIT | LETTER)* ;
____________
elliot at wpi.edu
Worcester Polytechnic Institute '09
Computer Science
More information about the antlr-interest
mailing list