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

查看:37
本文介绍了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() 并破解上下文 c'tor 名称(类似于 here) 但感觉 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天全站免登陆