[antlr-interest] Question of Repetead tokens and early termination
Victor Giordano
power_giordo at yahoo.com.ar
Wed Feb 2 11:18:04 PST 2011
Hi there. I am having trouble with the error handling.
I have a grammar for recoignize linear expression. And it works great!.
The grammar for a linear expresion is the following:
tokens
{
PLUS = '+';
MINUS = '-';
MUL = '*';
DIV = '/';
}
linexpr : (MINUS|PLUS)? linterm ((PLUS|MINUS) linterm)*;
linterm : factor? ID;
expr returns [double value]
: e=term {$value = $e.value;}
( PLUS e=term {$value += $e.value;}
| MINUS e=term {$value -= $e.value;}
)*;
term returns [double value]
: f=factor {$value = $f.value;}
( MUL f=factor {$value *= $f.value;}
| DIV f=factor {$value /= $f.value;}
)*;
factor returns [double value]
: DOUBLE {$value = Double.parseDouble($DOUBLE.text);}
| '(' e=expr ')'{$value = $e.value;};
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*;
DOUBLE
: ('0'..'9')+
| ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
| '.' ('0'..'9')+ EXPONENT?
| ('0'..'9')+ EXPONENT
;
fragment EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
NEWLINE:'\r'? '\n' { $channel = HIDDEN; };
WS : (' '|'\t'|'\n'|'\r')+ { $channel = HIDDEN; };
But the problem ocurrs when, for example, i have:
"x x x"
Then the parsers stop after processing the first "x".
¿How do i correctly emit an invalid syntax error?.
I Try with the catch EarlyExitException, but it doesn't works.
I Want, inside my java aplicacition to catch this, and show to the final
user.
Something like this...
//line is equals to the user input...
CharStream cs = new ANTLRStringStream(line);
LinearExpressionLexer lexer = new LinearExpressionLexer(cs);
CommonTokenStream tokens = new CommonTokenStream(lexer);
LinearExpressionParser parser = new
LinearExpressionParser(tokens);
res = parser.linexpr (); // and here, it's suppose to fail,
but it isn't.
Actually, the linexpr does returns some kind of data whose type is a
custom class called LinearExpresion. I omit to put the return in the
linearexpr parser rule to simplify things.
Hope anyone can help me.
Greettings and thanks for advance.
Víctor.
More information about the antlr-interest
mailing list