[antlr-interest] Error handling in lexer

Terence Parr parrt at cs.usfca.edu
Tue Nov 30 14:15:42 PST 2010


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



More information about the antlr-interest mailing list