Antlr4 Javascript目标-访客问题和标记为替代项 [英] Antlr4 Javascript target - issue with Visitor and labeled alternative

查看:155
本文介绍了Antlr4 Javascript目标-访客问题和标记为替代项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将antlr4(4.5.3)与Javascript目标一起使用,并尝试实现访问者.

I'm using antlr4 (4.5.3) with Javascript target, and trying to implement a visitor.

下面是antlr4本书的计算器示例(伟大的BTW),我正在尝试创建类似的语法:

Following the antlr4 book's calculator example (great book BTW) I'm trying to create a similar grammar:

...
expr:   expr op=(​'*'​|​'/'​) expr      # MulDiv
    |   expr op=(​'+'​|​'-'​) expr      # AddSub
    |   INT                         # int
    |   ​'('​ expr ​')'​                # parens
    ;
...

问题:为标记的替代项(例如visitMulDiv)创建了访问者方法,但是缺少两件事:

The issue: visitor methods are created for the labeled alternatives (for example visitMulDiv) however 2 thing are missing:

  1. 基本访问者原型中visitExpr的实现.
  2. 在调用this.visit(ctx.expr())时自动检测正确的替代方法-意味着访问正确的visitX方法.
  1. Implementation for visitExpr in the base visitor prototype.
  2. Auto detection of the correct alternative when calling this.visit(ctx.expr()) - meaning visiting the correct visitX method.

这是本书中实现Java访问者的方式.

This is how visitor in Java is implemented in the the book.

我通过实现visitExpr()并修改上下文的名称来解决此问题(类似于 ),但感觉JS应该像Java版本一样不受黑客攻击.

I have worked around this by implementing a visitExpr() and hacking the context c'tor name (similar to here) but feel the JS should work hack free, just like the Java version.

是错误还是我错过了什么?

Is it a bug or am I missing something?

推荐答案

我相信这是一个错误.在运行时源代码中,最新javascript运行时(4.5.2)中的ParseTreeVisitor.visit与python2版本(4.5.3)略有不同.在python2版本中,ParseTreeVisitor.visit利用RuleContext.accept方法来触发不同的访问者事件.我以为Antlr4的开发人员忘了更新javascript运行时.

I believed this is a bug. In runtime source code, ParseTreeVisitor.visit in the latest javascript runtime(4.5.2) is a bit different from python2 version(4.5.3). In python2 version, ParseTreeVisitor.visit leverage RuleContext.accept method to trigger different visitor events. I assumed developers of Antlr4 forgot to update javascript runtime.

有一个快速的解决方法.

There is quick workaround.

antlr4/tree/Tree.js

antlr4/tree/Tree.js

ParseTreeVisitor.prototype.visit = function(ctx) {
    // if (Utils.isArray(ctx)) {
    //  var self = this;
    //  return ctx.map(function(child) { return visitAtom(self, child)});
    // } else {
    //  return visitAtom(this, ctx);
    // }
    return ctx.accept(this)
};

有一种不修改库函数的更好方法.

There is a better way which doesn't modify library function.

ValidatorVisitor.prototype.visitExpr = function(ctx) {
    return ctx.accept(this);
}

这篇关于Antlr4 Javascript目标-访客问题和标记为替代项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆