当前位置: 首页 > 知识库问答 >
问题:

如何从ANTLR 4访问者报告错误?

荀振国
2023-03-14

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

共有1个答案

聂永怡
2023-03-14

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

简单的例子:

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
}
 类似资料:
  • 问题内容: 我目前正在尝试在Antlr4访问者的帮助下开发JavaScript编译器。我已经用Java实现了这一点,但无法弄清楚如何用JavaScript做到这一点。也许有人可以回答我几个问题? 1:在Java中,有一个Visitor.visit函数。如果我说得对,那么使用Javascript是不可能的。有没有解决的办法? 2:我的Javascript访问者获得了所有生成的访问函数,但是当我使用c

  • 根据antlr4书(第159页),并使用语法Ambig. g4,语法歧义可以通过以下方式报告: 或等效代码形式: grun命令使用antlr-4.5.3为我正确报告歧义。但是当我使用代码表单时,我没有收到歧义报告。这是命令跟踪: TestA_Listener.java代码如下: 有人能指出应该如何修改上述java代码以打印歧义报告吗? 为了完整起见,下面是代码 Ambig.g4 : 语法阿姆比格;

  • 我正在为使用ANTLR4的某种语言开发一个小型IDE,当lexer无法匹配错误字符时,我需要在错误字符下划线。在这种情况下,内置的实现向stderr输出一条消息,类似于如下所示: 我完全可以理解如何获得关于错误的行和列的信息(作为参数传递给回调),但如何在回调中获得字符串? 当解析器是错误的来源时,它会将违规令牌作为回调的第二个参数传递,因此提取关于错误输入的开始和停止偏移量的信息变得很简单,参考

  • 如果Nacos项目的任何部分存在问题或文档问题,请通过opening an issue告诉我们。我们非常认真地对待错误和错误,在产品面前没有不重要的问题。不过在创建错误报告之前,请检查是否存在报告相同问题的issues。 为了使错误报告准确且易于理解,请尝试创建以下错误报告: 具体到细节。包括尽可能多的细节:哪个版本,什么环境,什么配置等。如果错误与运行Nacos服务器有关,请附加Nacos日志(

  • 需要一个用作所有函数的返回类型的类型。如果我需要生成一个AST,我应该使用什么返回类型?ANTLR3使用了 对象。 当输入节点时,我可以创建树的一个节点,但应该如何跟踪它的父节点? 关于如何将树重写规则转换为生成AST节点的方法,是否有任何示例?如果不是,是否可以为下面的规则提供一个示例? 下面是(3)的规则:

  • 错误日志对于发现程序中的错误是非常有帮助的,但是有些时候它也会将应用程序的结构暴露给外部。为了有效的保护你的应用程序不受到由此而引发的问题。你需要将在你的服务器上使用开发和生产(线上)两套不同的配置。 开发环境 为了在开发环境中显示所有可能的错误,将你的 php.ini 进行如下配置: display_errors = On display_startup_errors = On error_re