[antlr-interest] unary minus
    Anders Hessellund 
    anders.hessellund at gmail.com
       
    Sat Mar  7 13:16:48 PST 2009
    
    
  
Thanks,
I found your guide on removing global backtracking
(http://www.antlr.org/wiki/display/ANTLR3/How+to+remove+global+backtracking+from+your+grammar).
After looking at your grammar and playing around with my own, I found
that the problem was caused by another rule.
The problem arises because a paranthesis can either contain an orExpr
or an arithmeticExpr. I will probably have do some sort of magic with
predicates?
-- AH
grammar McAntlrExpression;
options {
	output=AST;
	ASTLabelType=CommonTree;
    //backtrack=true;
    //memoize=true;
}
expr:	orExpr	{ System.out.println($orExpr.tree.toStringTree()); } EOF
	;
orExpr
	:	andExpr ( OR^ andExpr )*
	; 	
andExpr
	:	equalityExpr ( AND^ equalityExpr )*
	;
equalityExpr
	:	notExpr ( equalityOp^ notExpr )*
	;	
	
notExpr
	:	(NOT*)^ boolExpr
	;
boolExpr
	:	arithmeticExpr ( relationalOp^ | equalityOp^ ) arithmeticExpr
	|	LP! orExpr RP!
	|	BOOLEAN
	;
arithmeticExpr
	:	sumExpr ( addSubOp^ sumExpr )*
	;
	
sumExpr
	:	unaryExpr ( mulDivOp^ unaryExpr )*
	;
unaryExpr
	:	(MINUS*)^ atom
	;
atom
	:	LP! arithmeticExpr RP!
	| 	INTEGER
	;
relationalOp
    :	LT
    |	GT
    |	LE
    |	GE
    ;
equalityOp
	:	EQ
	|	NEQ
	;
addSubOp
	:	PLUS
	|	MINUS
	;
mulDivOp
	:	MULT
	|	DIV	
	;
LT 	:	'<';
GT 	:	'>';
LE	:	'<=';
GE	:	'>=';
EQ	:	'=';
NEQ	:	'!=';
PLUS:	'+';
MINUS
	:	'-';
MULT:	'*';
DIV	:	'/';
LP	:	'(';
RP	:	')';
NOT	:	'not';
AND	:	'and';
OR	:	'or';
INTEGER
	:	'0'..'9'+ ;
BOOLEAN	
	:	'true' | 'false';
CONSTANT
	:   ('a'..'z'|'A'..'Z')+ ;
NEWLINE
	:'\r'? '\n' ;
WS  :   (' '|'\t')+ {skip();} ;
    
    
More information about the antlr-interest
mailing list