Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取antlr4错误输出?_Java_Antlr4 - Fatal编程技术网

Java 如何获取antlr4错误输出?

Java 如何获取antlr4错误输出?,java,antlr4,Java,Antlr4,堆栈溢出 我正在使用antlr4解析输入。 我有我的XXXX.g4语法文件,antlr4 maven插件在构建时为我生成了一些解析器代码。 我正在用该代码解析输入: XXXXParser parser = new XXXXParser(new CommonTokenStream( new XXXXLexer(new ANTLRInputStream(currentInput)))); parser.command(); 在上面的代码中,“command”是我语法中规则的

堆栈溢出

我正在使用antlr4解析输入。 我有我的XXXX.g4语法文件,antlr4 maven插件在构建时为我生成了一些解析器代码。 我正在用该代码解析输入:

XXXXParser parser = new XXXXParser(new CommonTokenStream(
            new XXXXLexer(new ANTLRInputStream(currentInput))));
parser.command();

在上面的代码中,“command”是我语法中规则的名称。每次启动此代码时,如果currentInput字符串不符合语法,我会在控制台中收到一条错误消息。我希望能够捕捉这些信息并使用它们。问题是如何实现这一点?

您可以编写一个实现
iantlerrorlistener
的类,然后调用
parser.AddErrorListener()
并传入自定义错误列表。下面是我自己代码中的一个示例(我实际上继承了
DiagnosticErrorListener
):


非常感谢你!我实际上使用的是Java,不是C#,但不管怎样,你的代码给了我正确的想法,现在一切都正常了。
public class CustomErrorListener : DiagnosticErrorListener
{
    private readonly List<string> _errorMessages = new List<string>();
    public IList<string> ErrorMessages { get { return _errorMessages; } }

    private readonly List<string> _warningMessages = new List<string>();
    public IList<string> WarningMessages { get { return _warningMessages; } }

    public bool HasErrors { get { return _errorMessages.Count > 0; } }
    public bool HasWarnings { get { return _warningMessages.Count > 0; } }

    private readonly bool _captureDiagnostics;

    public CustomErrorListener(bool captureDiagnosticWarnings)
    {
        _captureDiagnostics = captureDiagnosticWarnings;
    }

    public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
    {
        _errorMessages.Add(string.Format("line {0}:{1} {2} at: {3}", line, charPositionInLine, msg, offendingSymbol.Text));
    }

    public override void ReportAmbiguity(Parser recognizer, Antlr4.Runtime.Dfa.DFA dfa, int startIndex, int stopIndex, bool exact, Sharpen.BitSet ambigAlts, Antlr4.Runtime.Atn.ATNConfigSet configs)
    {
        if (_captureDiagnostics)
        {
            _warningMessages.Add(string.Format("reportAmbiguity d={0}: ambigAlts={1}, input='{2}'", GetDecisionDescription(recognizer, dfa), GetConflictingAlts(ambigAlts, configs), ((ITokenStream)recognizer.InputStream).GetText(Interval.Of(startIndex, stopIndex))));
        }
    }

    public override void ReportAttemptingFullContext(Parser recognizer, Antlr4.Runtime.Dfa.DFA dfa, int startIndex, int stopIndex, Sharpen.BitSet conflictingAlts, Antlr4.Runtime.Atn.SimulatorState conflictState)
    {
        if (_captureDiagnostics)
        {
            _warningMessages.Add(string.Format("reportAttemptingFullContext d={0}, input='{1}'", GetDecisionDescription(recognizer, dfa), ((ITokenStream)recognizer.InputStream).GetText(Interval.Of(startIndex, stopIndex))));
        }
    }

    public override void ReportContextSensitivity(Parser recognizer, Antlr4.Runtime.Dfa.DFA dfa, int startIndex, int stopIndex, int prediction, Antlr4.Runtime.Atn.SimulatorState acceptState)
    {
        if (_captureDiagnostics)
        {
            _warningMessages.Add(string.Format("reportContextSensitivity d={0}, input='{1}'", GetDecisionDescription(recognizer, dfa), ((ITokenStream)recognizer.InputStream).GetText(Interval.Of(startIndex, stopIndex))));
        }
    }
}
XXXXParser parser = new XXXXParser(new CommonTokenStream(
            new XXXXLexer(new ANTLRInputStream(currentInput))));
CustomErrorListener errorListener = new CustomErrorListener(false);
parser.AddErrorListener(errorListener);
parser.command();