[antlr-interest] C# Error Recovery
Terence Parr
parrt at cs.usfca.edu
Wed Apr 16 15:32:44 PDT 2008
On Apr 16, 2008, at 1:55 PM, Johannes Luber wrote:
> Gavin Lambert schrieb:
>> I have a rule like this in my grammar (C# target, latest interim
>> build):
>> tag[String name]
>> : WS? t=TAG { $t.text.Equals("<" + $name + ">") }? NL
>> ;
>> catch [FailedPredicateException ex] { throw new
>> RecognitionException("Expected <" + $name + "> but found " +
>> $t.text, ex, Input); }
>> The intent should be clear -- I want to validate that I'm receiving
>> the tag I'm expecting to get at that point in the input, but I want
>> to give it a custom error message.
>> I want all the normal ANTLR backtracking and recovery mechanisms to
>> take effect, which basically seems to mean that I need to be
>> throwing a RecognitionException or derived class thereof.
>> The problem lies in BaseRecognizer.GetErrorMessage, which
>> completely ignores the Message of the incoming exception and uses a
>> series of type-specific tests to construct a new message; leaving
>> it blank if a base RecognitionException is thrown. I can work
>> around this by deriving a new exception from RecognitionException
>> and overriding GetErrorMessage to deal with that appropriately, but
>> I shouldn't need to.
>> Proposed fixes:
>> 1. At minimum, the first line of GetErrorMessage should be changed
>> to assign "e.Message" as the default message, not null.
>> 2. Preferably, *all* the type specific code in GetErrorMessage
>> should be removed, and the exception Message should be set to the
>> equivalent when the exception is thrown in the first place (in
>> their constructors). It just seems silly to try to "fix it up"
>> after the fact.
> I'm not opposed against a fix, but the last paragraph isn't quite
> clear to me. Equivalent of what? Furthermore, Ter, why is that code,
> as it is? After all, it is like this in the Java target, too.
Here were my thoughts at the time:
/** What error message should be generated for the various
* exception types?
*
* Not very object-oriented code, but I like having all error message
* generation within one method rather than spread among all of the
* exception classes. This also makes it much easier for the exception
* handling because the exception classes do not have to have
pointers back
* to this object to access utility routines and so on. Also, changing
* the message for an exception type would be difficult because you
* would have to subclassing exception, but then somehow get ANTLR
* to make those kinds of exception objects instead of the default.
* This looks weird, but trust me--it makes the most sense in terms
* of flexibility.
*
* For grammar debugging, you will want to override this to add
* more information such as the stack frame with
* getRuleInvocationStack(e, this.getClass().getName()) and,
* for no viable alts, the decision description and state etc...
*
* Override this to change the message generated for one or more
* exception types.
*/
Still seems valid I guess.
Ter
More information about the antlr-interest
mailing list