在 "No viable alternative at input" 中包含空格 - ANTLR4 中的异常
Include whitespaces in "No viable alternative at input"-exception in ANTLR4
当解析我的文档并提供代码时,ANTLR4 没有可行的替代方法,我在我的错误处理程序中正确地收到了一个语法错误消息:no viable alternative at input '/mig100100moveto250230linetostroke350150moveto200200{'
因为我使用以下 Lexer-Rules
从输入中去除了空格
NEWLINE: ('\r')? '\n' -> skip;
WHITESPACE: (' '|'\t')+ -> skip;
它不再包含空格和换行符。
有什么方法可以在 ErrorHandler 中获取格式正确的消息(可能来自输入流),该消息可以打印出来并且仍然包含空格?例如
no viable alternative at input '/mig
100 100 moveto
250 230 lineto
stroke
350 150 moveto
200 200 {'
我在派生自 BaseErrorListener
的 class 中尝试了以下方法
public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
var interval = new Interval(offendingSymbol.StartIndex, offendingSymbol.StopIndex);
var inputStream = offendingSymbol.InputStream as AntlrInputStream;
if (inputStream != null)
{
// TODO: If you get the source-code without the spaces, use this original text instead.
var originalText = inputStream.GetText(interval);
}
Console.WriteLine("Line {0}:{1} {2}", line, charPositionInLine, msg);
Console.WriteLine("Line {0}:{1} {2}", line, charPositionInLine, originalText);
}
但是结果 originalText
只包含有问题的符号 {
而不是解析器找不到可行替代的地方。
如果我能得到索引,我会很高兴,解析器在索引中找不到可行的替代方案(在 /mig
的开头)
您可以将它们设置为隐藏频道,而不是跳过令牌。
这将在显示错误消息时保留空白。
NEWLINE: ('\r')? '\n' -> channel(HIDDEN);
WHITESPACE: (' '|'\t')+ -> channel(HIDDEN);
当解析我的文档并提供代码时,ANTLR4 没有可行的替代方法,我在我的错误处理程序中正确地收到了一个语法错误消息:no viable alternative at input '/mig100100moveto250230linetostroke350150moveto200200{'
因为我使用以下 Lexer-Rules
从输入中去除了空格NEWLINE: ('\r')? '\n' -> skip;
WHITESPACE: (' '|'\t')+ -> skip;
它不再包含空格和换行符。
有什么方法可以在 ErrorHandler 中获取格式正确的消息(可能来自输入流),该消息可以打印出来并且仍然包含空格?例如
no viable alternative at input '/mig
100 100 moveto
250 230 lineto
stroke
350 150 moveto
200 200 {'
我在派生自 BaseErrorListener
public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
var interval = new Interval(offendingSymbol.StartIndex, offendingSymbol.StopIndex);
var inputStream = offendingSymbol.InputStream as AntlrInputStream;
if (inputStream != null)
{
// TODO: If you get the source-code without the spaces, use this original text instead.
var originalText = inputStream.GetText(interval);
}
Console.WriteLine("Line {0}:{1} {2}", line, charPositionInLine, msg);
Console.WriteLine("Line {0}:{1} {2}", line, charPositionInLine, originalText);
}
但是结果 originalText
只包含有问题的符号 {
而不是解析器找不到可行替代的地方。
如果我能得到索引,我会很高兴,解析器在索引中找不到可行的替代方案(在 /mig
的开头)
您可以将它们设置为隐藏频道,而不是跳过令牌。 这将在显示错误消息时保留空白。
NEWLINE: ('\r')? '\n' -> channel(HIDDEN);
WHITESPACE: (' '|'\t')+ -> channel(HIDDEN);