Pessoal,
Escrevi a gramática abaixo (é a minha primeira, deve estar uma porcaria e ainda não terminei todos as regras!). Mas por agora o problema que estou tendo é que ela está aceitando expressões como AGL(L1)1+2AGL(L2), quando deveria dar erro pois AGL(L1)1 não deveria ser válido… bom, não sei como resolver. Se puder dar uma olhada e me indicar uma solução, algum material, etc, ficaria muito grato!
grammar expressaoMC;
// Expressao
expression : term ( ( PLUS | MINUS ) term ) * ;
// Termos
term : factor ( ( MULT | DIV ) factor ) * ;
// Fatores
factor : NUMBER | function ;
// Funcoes
function : functionPM
| functionNum
| functionLog ;
functionPM :
( ‘ACB’
| ‘ACL’
| ‘AGB’
)
( LPAREN pm RPAREN
) ;
functionNum :
( ‘MAX’
| ‘MIN’
)
( LPAREN expression SEMI expression RPAREN
) ;
functionLog : ‘SE’ LPAREN expression SEMI expression SEMI expression RPAREN;
// Tipos (parametros para funcoes)
pm :
( ‘L’
| ‘B’
) NUMBER ;
NUMBER : ( ‘0’ … ‘9’ ) + ;
// Operadores matematicos
PLUS : ‘+’ ;
MINUS : ‘-’ ;
MULT : ‘*’ ;
DIV : ‘/’ ;
LPAREN : ‘(’ ;
RPAREN : ‘)’ ;
// Operadores relacionais
EQUALS : ‘=’ ;
GT : ‘>’ ;
GET : ‘>=’ ;
LT : ‘<’ ;
LET : ‘<=’ ;
// Operadores logicos
AND : ‘E’ ;
OR : ‘OU’ ;
// Operador de subexpressao
SUB : ‘!’ ;
// Espaco em branco
WS :
( ‘\t’
| ’ ’
| ‘\r’
| ‘\n’
| ‘\u000C’
) + { $channel = HIDDEN; } ;
// SEPARADORES
SEMI : ‘;’ ;
