[antlr-interest] Error handling in lexer

Arthur Goldberg goldberg at cbio.mskcc.org
Tue Nov 30 14:54:56 PST 2010


Sure, but how dows one tell ANTLR to tell the lexer to throw a certain 
RuntimeException? the lexer doesn't use
>         catch (RecognitionException re) {
>             reportError(re);
>             recover(input,re);
>         }
Suppose I want the lexer to report every error by doing:

throw new IllegalArgumentException( "Syntax error at char <c> of line 
<l>: did not expect '<x>'." );

where c, l and x are appropriately instantiated.

thanks
A

On 11/30/10 5:15 PM, Terence Parr wrote:
> Perhaps send a RuntimeException that is not caught by other stuff?
> Ter
> On Nov 30, 2010, at 1:15 PM, Arthur Goldberg wrote:
>
>> Hi All
>>
>> I've another question related to the same project. (I won't be bothering
>> you much longer, it's due by the end of the week. :-)  I've got to move
>> really quickly now.)
>>
>> Typically, errors in ANTLR parsers are sent to stderr, via this
>> emitErrorMessage:
>>
>> 00189<http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_base_recognizer.html#85afd3931a36f93c5e1fee84349b5673>           public  void  displayRecognitionError<http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_base_recognizer.html#85afd3931a36f93c5e1fee84349b5673>(String[] tokenNames,
>> 00190RecognitionException<http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_recognition_exception.html>   e)
>> 00191         {
>> 00192                 String hdr =getErrorHeader<http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_base_recognizer.html#08b70239348297407c4322a00a46c77c>(e);
>> 00193                 String msg =getErrorMessage<http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_base_recognizer.html#f5adeec09d6d06b09bf18e2c14620093>(e, tokenNames);
>> 00194emitErrorMessage<http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_base_recognizer.html#20c71583ddc8a129bf81ef64a1fb4857>(hdr+""+msg);
>> 00195         }
>>
>>
>> But my lang will be embedded in a Web site, so rather than outputting
>> errors to stderr I want to report them by throwing exceptions, which are
>> easy to handle.
>> In my AST-producing grammar, I report syntactic errors by modifying
>> reportError() to throw an IllegalArgumentException:
>>>        public void reportError(RecognitionException e) {
>>>            // if we've already reported an error and have not matched
>>> a token
>>>            // yet successfully, don't report any errors.
>>>            if ( state.errorRecovery ) {
>>>                    //System.err.print("[SPURIOUS] ");
>>>                    return;
>>>            }
>>>            state.syntaxErrors++; // don't count spurious
>>>            state.errorRecovery = true;
>>>            throw new IllegalArgumentException(
>>> getRecognitionError(this.getTokenNames(), e) );
>>>        }
>>>
>> getRecognitionError returns a string similar to the string that would
>> normally be printed by displayRecognitionError.
>>
>> In my tree grammar, a production can simply throw IllegalArgumentException.
>>
>> But how -- short of modifying *Lexer.java -- can I direct the Lexer to
>> throw an Exception which my driver can catch?
>>
>> Thanks
>> Deadline looming!
>> A
>>
>> -- 
>> Senior Research Scientist
>> Computational Biology
>> Memorial Sloan-Kettering Cancer Center
>>
>>
>> List: http://www.antlr.org/mailman/listinfo/antlr-interest
>> Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your-email-address

-- 
Senior Research Scientist
Computational Biology
Memorial Sloan-Kettering Cancer Center




More information about the antlr-interest mailing list