如何报告来自 ANTLR 4 Visitor 的错误?

How to report errors from ANTLR 4 Visitor?

我为布尔表达式创建了一个语法,现在我正在尝试实现访问者来评估它。

据说没有必要通过语义分析使语法词法分析器和解析器规则过于复杂,因为从访问者那里提供有意义的错误消息要好得多。

所以我正在尝试检查访问者中的类型一致性、日期正确性等。令我惊讶的是,除了抛出异常之外,没有其他方法(至少我没有看到)报告来自访问者的错误。如果我抛出异常,我将无法继续进行表达式验证并立即检测到所有错误。此外,我必须以某种方式捕获所有解析异常类型(我应该如何知道它们?)。总而言之,异常抛出似乎不是正确的解决方案。

你能告诉我计划如何在访问者遍历期间报告表达式语义错误吗?

既然你定义了访问者,你就可以创建并传递一个对象,它会向它报告错误。

简单示例:

public interface IErrorReporter
{
    void ReportError(ParserRuleContext context, string error);
}
public class ValidationVisitor : YourLanguageBaseVisitor<Whatever>
{
    private readonly IErrorReporter _errorReporter;

    public ValidationVisitor(IErrorReporter errorReporter)
    {
        _errorReporter = errorReporter;
    }

    public override Whatever VisitSomeNode(YourLanguageParser.SomeNodeContext context)
    {
        if (context.GetText() != "expected")
            _errorReporter.ReportError(context, "Invalid text");

        return Visit(context.someSubNode());
    }
}

然后像这样验证:

var parseTree = DoTheParsingStuff();

// Implement that one, store the errors in a list
var errorReporter = new SimpleErrorReporter();  

new ValidationVisitor(errorReporter).Visit(parseTree);

if (errorReporter.Errors.Count > 0)
{
    // Display errors
}

ParserRuleContext 可用于定位错误发生的位置(line/column 等),否则您可以实施任何适合您的错误报告需要的方法。


旁注: 如果您计划有很多访问者,则 然后 基于此进行验证可能是益中长运行。你需要决定是否值得。