gpt4 book ai didi

parsing - 如何遍历解析树以检查ANTLR中的语法错误

转载 作者:行者123 更新时间:2023-12-03 08:11:24 25 4
gpt4 key购买 nike

我在ANTLR中写了一种相当简单的语言。在实际解释用户编写的代码之前,我希望先分析代码并检查语法错误。如果找到,我希望输出错误原因并退出。如何检查代码中的语法错误并输出相应的错误。请不要出于我的目的,与ANTLR工具生成的错误语句相似的错误语句绰绰有余。例如

line 3:0 missing ';'

最佳答案

您可以使用ErrorListener获得更多信息。

例如:

...
FormulaParser parser = new FormulaParser(tokens);
parser.IsCompletion = options.IsForCompletion;
ErrorListener errListener = new ErrorListener();
parser.AddErrorListener(errListener);
IParseTree tree = parser.formula();

您只需要做的就是将ErrorListener附加到解析器。
这是ErrorListener的代码。
    /// <summary>
/// Error listener recording all errors that Antlr parser raises during parsing.
/// </summary>
internal class ErrorListener : BaseErrorListener
{
private const string Eof = "the end of formula";

public ErrorListener()
{
ErrorMessages = new List<ErrorInfo>();
}

public bool ErrorOccured { get; private set; }
public List<ErrorInfo> ErrorMessages { get; private set; }

public override void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
ErrorOccured = true;

if (e == null || e.GetType() != typeof(NoViableAltException))
{
ErrorMessages.Add(new ErrorInfo()
{
Message = ConvertMessage(msg),
StartIndex = offendingSymbol.StartIndex,
Column = offendingSymbol.Column + 1,
Line = offendingSymbol.Line,
Length = offendingSymbol.Text.Length
});
return;
}

ErrorMessages.Add(new ErrorInfo()
{
Message = string.Format("{0}{1}", ConvertToken(offendingSymbol.Text), " unexpected"),
StartIndex = offendingSymbol.StartIndex,
Column = offendingSymbol.Column + 1,
Line = offendingSymbol.Line,
Length = offendingSymbol.Text.Length
});
}

public override void ReportAmbiguity(Antlr4.Runtime.Parser recognizer, DFA dfa, int startIndex, int stopIndex, bool exact, BitSet ambigAlts, ATNConfigSet configs)
{
ErrorOccured = true;
ErrorMessages.Add(new ErrorInfo()
{
Message = "Ambiguity", Column = startIndex, StartIndex = startIndex
});
base.ReportAmbiguity(recognizer, dfa, startIndex, stopIndex, exact, ambigAlts, configs);
}

private string ConvertToken(string token)
{
return string.Equals(token, "<EOF>", StringComparison.InvariantCultureIgnoreCase)
? Eof
: token;
}

private string ConvertMessage(string message)
{
StringBuilder builder = new StringBuilder(message);
builder.Replace("<EOF>", Eof);
return builder.ToString();
}
}

它是一些虚拟侦听器,但您可以看到它的作用。并且您可以判断该错误是语法错误还是一些歧义错误。解析之后,您可以直接询问errorListener,是否发生一些错误。

关于parsing - 如何遍历解析树以检查ANTLR中的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36232361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com