[antlr-interest] Error handeling in antlr 3.2

preitz sharma p4rst2 at gmail.com
Sun Apr 10 23:27:09 PDT 2011


Hi,
I need to report  customized error when ever user input does not match
our defined rules.

Here is my code:

   grammar second1;

   @lexer::members {
   @Override
   public void reportError(RecognitionException e) {
       System.out.println("Throwing Exception: "+ e.getMessage());
       displayRecognitionError(getTokenNames(), e);
       throw new IllegalArgumentException(e);
     }
     @Override
     public void displayRecognitionError(String[] tokenNames,
RecognitionException e) {
           String hdr = getErrorHeader(e);
           String msg = getErrorMessage(e, tokenNames);
           System.out.println(hdr + " " + msg);
        }
   }

   @parser::members {
   public void reportError(RecognitionException e) {
       System.out.println("Throwing Exception: "+ e.getMessage());
       displayRecognitionError(getTokenNames(), e);
       throw new IllegalArgumentException(e);
     }
     @Override
     public void displayRecognitionError(String[] tokenNames,
RecognitionException e) {
           String hdr = getErrorHeader(e);
           String msg = getErrorMessage(e, tokenNames);
           System.out.println(hdr + " " + msg);
         }
    private boolean inbounds(Token t, int min, int max, String methodName) {
          int n = Integer.parseInt(t.getText());
          if(n >= min && n <= max) {
             return true;
          }
      else {
        System.out.println("The range for value accepted by " + methodName+"
is "+min +"-" + max );
        return false;
      }
    }
   }

   expr       :  SET attribute EOF;

   attribute  :  Value1 int1:integer1["Value1"]    {
System.out.println("Accepted");    }
                   |  Value2 integer2 ["Value2"]          {
System.out.println("Accepted");       }
          ;
          exception[int1]:
               catch[Exception e] {System.out.println("Error Reported for
int1");}
          exception:
               catch[Exception e] {System.out.println("General error
Reported");}

   integer1 [String methodName]   :  Int { inbounds($Int, 0,1000,methodName)
}? ;
   integer2 [String methodName]  :  Int { inbounds($Int, 0,10000,methodName)
}? ;
   Int        :  '0'..'9'+;

   SET        :  'set';
   Value1     :  'value';
   Value2     :  'value2';

   fragment WS
     : (' ' | '\t')
    ;

But while compiling this code I am getting the following errors:


   error(100): second1.g:26:22: syntax error: antlr: second1.g:26:22:
unexpected token: int1
   error(100): second1.g:29:17: syntax error: antlr: second1.g:29:17:
unexpected token: :
   error(100): second1.g:32:10: syntax error: antlr: second1.g:32:10:
unexpected token: catch
   error(100): second1.g:0:0: syntax error: assign.types: <AST>:0:0:
unexpected AST node: <end-of-block>
   error(100): second1.g:0:0: syntax error: assign.types: <AST>:0:0:
unexpected end of subtree
   error(100): second1.g:0:0: syntax error: define: <AST>:0:0: unexpected
AST node: <end-of-block>
   error(100): second1.g:0:0: syntax error: define: <AST>:0:0: unexpected
AST node: <end-of-block>
   error(100): second1.g:0:0: syntax error: define: <AST>:0:0: unexpected
end of subtree
   error(106): second1.g:26:27: reference to undefined rule: integer1
   error(106): second1.g:27:22: reference to undefined rule: integer2
   warning(105): second1.g:27:15: no lexer rule corresponding to token:
Value2
   warning(105): second1.g:26:15: no lexer rule corresponding to token:
Value1
   warning(105): second1.g:24:15: no lexer rule corresponding to token: SET

What should I do? :(
I checked on the link: http://www.antlr.org/blog/antlr3/error.handling.tml ,
this is how we handle exception in ANTLR 3.x
Why is it not working in my case then :(
Please help me out.



-- 
Regards
Preeti Sharma


More information about the antlr-interest mailing list