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);
List stack = getRuleInvocationStack(e,
this.getClass().getName());
for(int i=0;i<stack.size();i++){
System.out.println(stack.get(i));
}
Object str = getCurrentInputSymbol(getTokenStream());
System.out.println(str.toString());
}
}
@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);
List stack = getRuleInvocationStack(e,
this.getClass().getName());
for(int i=0;i<stack.size();i++){
System.out.println(stack.get(i));
}
Object str = getCurrentInputSymbol(getTokenStream());
System.out.println(str.toString());
}
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 net, this is how we handle exception in ANTLR 3.x
Why is it not working in my case then :(
Please help me out.
--
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.