Thanks, Andrew! That works for the parser.

For the lexer, it apparently isn't so simple in java, because
reportError() doesn't declare any exceptions. There's a wiki page that
explains what to do for the lexer:

http://www.antlr.org/wiki/pages/viewpage.action?pageId=5341217

The quick summary is either (1) override nextToken() to throw a
Recognition Exception instead of call reportError() (2) use sneaky
java tricks to let you throw RecognitionException anyway (3) throw the
RecognitionException wrapped in a RuntimeException.

Dan

On Mon, Mar 15, 2010 at 4:25 PM, Andrew Haritonkin <[email protected]> wrote:
> On Mon, Mar 15, 2010 at 9:41 PM, Kirby Bohling <[email protected]> 
> wrote:
>> You need to repeat some of that for the lexer.  Using the
>> @lexer::members syntax if you're going to do it as a combined
>> lexer/parser grammar (I always separate mine to keep my mental working
>> set smaller).  If you don't do the lexer, you can have a lex error and
>> recover from it, but this should catch all of the parse errors.
>>
>> Kirby
>>
>>
>> On Mon, Mar 15, 2010 at 3:32 PM, Andrew Haritonkin <[email protected]> wrote:
>>> For Java and C# target add this in the beginning of the grammar but
>>> after grammar statement:
>>>
>>> grammar grammar1;
>>>
>>> @members {
>>> protected override object RecoverFromMismatchedToken(IIntStream input,
>>> int ttype, BitSet follow)
>>> {
>>>        throw new MismatchedTokenException(ttype, input);
>>> }
>>> public override object RecoverFromMismatchedSet(IIntStream input,
>>> RecognitionException e, BitSet follow)
>>> {
>>>        throw e;
>>> }
>>> }
>>>
>>> @rulecatch {
>>> catch (RecognitionException e)
>>> {
>>>    throw e;
>>> }
>>> }
>>>
>>> Hope it helps,
>>> Andrew
>>>
>
> Indeed, forgot about lexer... So, the full code which you need to add
> to the grammar for C# target would be:
>
> grammar grammar1;
>
> @lexer::members {
> public override void ReportError(RecognitionException e)
> {
>        throw e;
> }
> }
>
> @parser::members {
> protected override object RecoverFromMismatchedToken(IIntStream input,
> int ttype, BitSet follow)
> {
>        throw new MismatchedTokenException(ttype, input);
> }
> public override object RecoverFromMismatchedSet(IIntStream input,
> RecognitionException e, BitSet follow)
> {
>        throw e;
> }
> }
>
> @rulecatch {
> catch (RecognitionException e)
> {
>    throw e;
> }
> }
>
> Similar should be for Java target, only naming convention is different.
>
> Andrew
>



-- 
Dan Becker
303/497-6824

List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe: 
http://www.antlr.org/mailman/options/antlr-interest/your-email-address

-- 
You received this message because you are subscribed to the Google Groups 
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/il-antlr-interest?hl=en.

Reply via email to