Add an ErrorHandler member to your parser, with an AddError method. Call
it from both your override of ReportError and wherever you want to add
your own semantic error. I have a whole bunch of helper methods like the
following as well. Please note that this code is not plug-and-play;
you'll have to implement your own ErrorHandler class and TextSpan is
probably not a type in your program, etc. I only mean this as a
human-readable example of a method that's worked for me. :)
public override void ReportError( RecognitionException e )
{
if ( state.backtracking == 0 )
{
string message = GetErrorMessage( e, GetTokenNames() );
TextSpan span = new TextSpan()
{
iStartLine = e.line - 1,
iStartIndex = e.charPositionInLine,
iEndLine = e.line - 1,
iEndIndex = e.charPositionInLine + 1
};
if ( ( e.token == null || e.token.Type == 0 )
&& e.node is CommonErrorNode
&& ( (CommonErrorNode)e.node ).trappedException != null )
{
e.token = ( (CommonErrorNode)e.node
).trappedException.token;
}
if ( e.token != null )
{
if ( e.token.Type != (int)CharStreamConstants.Eof )
span = e.token.ToTextSpan();
else
span = TokenStream.LT( -1 ).ToTextSpan();
}
string tokentext = e.token.Text ?? string.Empty;
if ( ErrorHandler != null )
ErrorHandler.AddError( "Parser: " + message, span.iStartLine
+ 1, span.iStartIndex, tokentext.Length, Severity.Error, true );
}
base.ReportError( e );
}
public void AddError( string message, CommonTree tree )
{
if ( tree == null )
return;
AddError( message, (CommonToken)tree.Token );
}
public void AddError( string message, CommonTree tree, Severity severity
)
{
if ( tree == null )
return;
AddError( message, (CommonToken)tree.Token, severity );
}
public void AddError( string message, CommonToken token )
{
if ( token == null )
return;
AddError( message, token, Severity.Error );
}
public void AddError( string message, CommonToken token, Severity
severity )
{
if ( string.IsNullOrEmpty( message ) || token == null ||
ErrorHandler == null )
return;
int line = token.Line;
int col = token.CharPositionInLine;
int length = token.StopIndex - token.StartIndex + 1;
// these errors aren't forcing the parser into recovery mode so they
// shouldn't have the same devastating performance impact
bool canCancel = false;
ErrorHandler.AddError( message, line, col, length, severity,
canCancel );
}
public void AddWarning( string message, CommonTree tree )
{
AddError( message, tree, Severity.Warning );
}
public void AddWarning( string message, CommonToken token )
{
AddError( message, token, Severity.Warning );
}
Sam Harwell
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of dhjdhj
Sent: Friday, April 10, 2009 11:16 AM
To: [email protected]
Subject: [antlr-interest] How can I find the line number and column for
asemantic error
I understand that if I get a RecognitionException, I can extract the
line and column from the exeception.
However, suppose I'm inside a rule and I decide that I have a semantic
error (i.e, variable types aren't compatible or something). At that
point I want to generate a Semantic Error that will be caught at the
top level but I still need to know (at least) what line the semantic
error occurred. I tried to get that info out of the lexer but it
always returns the last line of the source code so that doesn't help.
I must be missing something non-obvious (to me) and would appreciate
suggestions.
Thanks,
David Jameson
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
-~----------~----~----~----~------~----~------~--~---
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address