[antlr-interest] modifying token creation

Jim Idle jimi at temporal-wave.com
Fri Sep 25 08:50:43 PDT 2009


On 09/24/2009 10:56 PM, Heiko Folkerts wrote:
> Hi Indhu and David,
> OK, maybe indhu is right and modifying the token creation is the wrong way to solve my error handling problems. When I try to retrieve user friendly error messages from wrong input the recognizer state gives me nothing to help me. The backtracking tries all paths and returns a no viable path exception. E.g. this is an excerpt from the grammar:
> statement:
>      actionexpression
>      | statecheck;
> statecheck: stateobject (stateoption  | ) compoperator selectedstate  ->  ^(STATECHECK stateobject ^(COMPERATOR compoperator) selectedstate stateoption) |
>      stateobject (stateoption  | ) compoperator paramname->  ^(STATECHECK stateobject ^(COMPERATOR compoperator) ^(PARAMREF paramname) stateoption);
> actionexpression: actionobject (actionoption | ) action ->  ^(ACTIONEXPRESSION actionobject action actionoption);
>
> The stateobject rules etc. use syntactic predicates to check wether the input is a correct keyword - thant engine is an legal object.
>
> Now if I enter the input "engine;" where engine is an object (stateobject and actionobject have the same meaning) I need to tell the user that we expect either an actionexpression or an statecheck instead of the ';'.
>
> I am coding in C so until ANTLR 3.2 the catch block in the grammar was not supported.
>
> So how would i deal best in such situations?
>
> Thx
>    
This is a side effect of using global backtracking. You won;t be able to 
deal with it effectively unless you left factor your grammar and get rid 
of the backtracking. You should think of backtracking as something to 
use when the input is pretty much guaranteed to be correct and the 
language seems too difficult to parse otherwise. I have only found 
VBScript to be such a language myself as it is interpreted and very 
ambiguous without runtime context.

Jim


More information about the antlr-interest mailing list