2010-10-25 8 views
7

estoy usando ANTLR (3.2) para analizar gramática bastante simple. Desafortunadamente, me encontré con un pequeño problema. Tome la regla follwoing:ANTLR: problema diferenciando operadores unarios y binarios (por ejemplo, signo menos)

exp 
: NUM 
| '(' expression OPERATOR expression ')' -> expression+ 
| '(' (MINUS | '!') expression ')' -> expression 
; 

OPERADOR contiene el mismo signo menos ('-') como se define con MENOS. Ahora ANTLR parece ser incapaz de lidiar con estas dos reglas. Si elimino cualquiera de los dos, todo funciona bien.

¿Alguna idea?

Respuesta

9

Haga que la expresión unaria sea la que tenga la mayor precedencia. También usaría un token diferente para el - único para hacer la distinción entre el menos mejor. Un demo:

grammar Exp; 

options { 
    output=AST; 
} 

tokens { 
    UNARY; 
} 

parse 
    : exp EOF 
    ; 

exp 
    : additionExp 
    ; 

additionExp 
    : multiplyExp ('+'^ multiplyExp | '-'^ multiplyExp)* 
    ; 

multiplyExp 
    : unaryExp ('*'^ unaryExp | '/'^ unaryExp)* 
    ; 

unaryExp 
    : '-' atom -> ^(UNARY atom) 
    | '!' atom -> ^('!' atom) 
    | atom 
    ; 

atom 
    : '(' exp ')' -> exp 
    | Number  -> Number 
    ; 

Number : ('0'..'9')+ ('.' ('0'..'9')+)? ; 

Spaces : (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;} ; 

Una prueba rápida con la fuente:

3 * -4 + 7/6 * -(3 + -7 * (4 + !2)) 

produjo el siguiente AST:

imagen alt text

+0

guau, gran trabajo, muchas gracias! – Christian

+0

@Christian, de nada. –

+0

¿Y cómo se supone que el tokenizer sabe al leer un signo menos si corresponde a un UNARIO? –

Cuestiones relacionadas