在&#34中包含空格;在ANTLR4中输入" -exception中没有可行的替代方案

时间:2015-06-29 10:22:53

标签: exception exception-handling antlr antlr4

在解析我的文档并提供没有ANTLR4替代方案的代码时,我在ErrorHandler中正确地收到了一条语法错误,其中包含以下消息:no viable alternative at input '/mig100100moveto250230linetostroke350150moveto200200{'

因为我使用以下Lexer-Rules

从输入中删除了空格
NEWLINE: ('\r')? '\n' -> skip;
WHITESPACE:   (' '|'\t')+ -> skip;

它不再包含空格和换行符。

有没有办法在ErrorHandler中获得格式正确的消息(可能来自输入流),可以打印出来但仍然包含空格? E.g。

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的开头)

1 个答案:

答案 0 :(得分:3)

您可以将其设置为HIDDEN频道,而不是跳过令牌。 这将在显示错误消息时保持空白。

NEWLINE:    ('\r')? '\n' -> channel(HIDDEN);
WHITESPACE: (' '|'\t')+  -> channel(HIDDEN);