当前位置: 首页 > 面试题库 >

Antlr4 Javascript访问者

董霖
2023-03-14
问题内容

我目前正在尝试在Antlr4访问者的帮助下开发JavaScript编译器。我已经用Java实现了这一点,但无法弄清楚如何用JavaScript做到这一点。也许有人可以回答我几个问题?

1:在Java中,有一个Visitor.visit函数。如果我说得对,那么使用Javascript是不可能的。有没有解决的办法?

2:我的Javascript访问者获得了所有生成的访问函数,但是当我使用console.log(ctx)时,上下文是未定义的。知道为什么吗?

从SimpleVisitor.js中提取:

// Visit a parse tree produced by SimpleParser#parse.
SimpleVisitor.prototype.visitParse = function(ctx) {
        console.log(ctx);
};

主要js文件:

var antlr4 = require('lib/antlr4/index');
var SimpleLexer = require('antlr4/SimpleLexer');
var SimpleParser = require('antlr4/SimpleParser');
var SimpleVisitor = require('antlr4/SimpleVisitor');

var input = "double hallo = 1;";
var chars = new antlr4.InputStream(input);
var lexer = new SimpleLexer.SimpleLexer(chars);
var tokens = new antlr4.CommonTokenStream(lexer);
var parser = new SimpleParser.SimpleParser(tokens);
var visitor = new SimpleVisitor.SimpleVisitor();
parser.buildParseTrees = true;
var tree = parser.parse();

visitor.visitParse();

这可能足以从…开始

布鲁诺

编辑:

上下文可能是未定义的,因为我没有参数就调用了函数,但是在哪里可以得到“开始”上下文呢?

编辑2:

所以我想我知道如何解决这个问题。还有一个问题,我该如何确定每个访问者函数中接下来要调用的规则?


问题答案:

访问者背后的基本思想是,您必须自己处理所有逻辑。为此,我使用antlr生成了访客。我自己的访问者会覆盖实现逻辑所需的所有功能。

  1. 创建词法分析器,令牌,…
        var antlr4 = require('antlr4/index');
    var SimpleJavaLexer = require('generated/GrammarLexer');
    var SimpleJavaParser = require('generated/GrammarParser');
    var SimpleJavaVisitor = require('generated/GrammarVisitor');
    var Visitor = require('./Visitor');

    var input = "TestInput";
    var chars = new antlr4.InputStream(input);
    var lexer = new GrammarLexer.GrammarLexer(chars);
    var tokens = new antlr4.CommonTokenStream(lexer);
    var parser = new GrammarParser.GrammarParser(tokens);
    var visitor = new Visitor.Visitor();
    parser.buildParseTrees = true;
    var tree = parser.parse();
  1. 并调用您的输入函数

    visitor.visitTest(tree);
    
  2. 在新访客内部,您需要实现新逻辑,以确定下一步要调用哪个函数(正确的上下文作为参数很重要)

        var GrammarVisitor =     require('generated/GrammarVisitor').GrammarVisitor;

    function Visitor () {
      SimpleJavaVisitor.call(this);
      return this;
    };

    Visitor.prototype = Object.create(GrammarVisitor.prototype);
    Visitor.prototype.constructor = Visitor;
    Visitor.prototype.visitTest = function(ctx) {
        // implement logic to determine which function to visit
        // then call next function and with the right context
        this.visitBlock(ctx.block());
    };

希望您能理解我的基本想法。如果有人有任何疑问,请发表评论。



 类似资料:
  • 我以前曾尝试向LineItem类添加访问器,如 并将FTL从更改为,但这不起作用。解决方案是添加访问器,但不更改FTL(保持为。 我正在用Freemarker格式化一些电子邮件。在这封电子邮件中,我被要求列出一系列产品信息,如发票上的信息。我的目标是传递一个对象列表(在一个映射中),以便在FTL中迭代它们。目前我遇到一个问题,无法从模板中访问对象属性。我可能只是错过了一些小东西,但现在我很难堪。

  • URL格式 ThinkCMF5采用的是混合模式路由,也就是说同时支持路由和PATH_INFO方式; 如果没有设置路由规则,默认就采用PATH_INFO方式,URL 格式如下: http://yourServerName/index.php/应用/控制器/操作/[参数名/参数值...] URL大小写 ThinkCMF5的 URL 是不区分大小写的,如: http://localhost/index

  • URL格式 ThinkCMF6.0采用的是混合模式路由,也就是说同时支持路由和PATH_INFO方式; 如果没有设置路由规则,默认就采用PATH_INFO方式,URL 格式如下: http://yourServerName/index.php(或其它入口文件)/应用/控制器/操作/[参数名/参数值...] URL大小写 ThinkCMF的 URL 是不区分大小写的,如: http://local

  • URL设计 ThinkPHP5.1在没有定义路由的情况下典型的URL访问规则是: http://serverName/index.php(或者其它应用入口文件)/模块/控制器/操作/[参数名/参数值...] 支持切换到命令行访问,如果切换到命令行模式下面的访问规则是: >php.exe index.php(或者其它应用入口文件) 模块/控制器/操作/[参数名/参数值…] 可以看到,无论是URL访问

  • Kibana 是一个 web 应用,可以通过5601端口访问。只需要在浏览器中指定 Kibana 运行的机器,然后指定端口号即可。例如, localhost:5601 或者 http://YOURDOMAIN.com:5601 。 当访问 Kibana 时,Discover 页默认会加载默认的索引模式。时间过滤器设置的时间为过去15分钟,查询设置为匹配所有 (*) 。 如果看不到任何文档,试着把时

  • 主要内容:介绍,实现,ComputerPart.java,Keyboard.java,Monitor.java,Mouse.java,Computer.java,ComputerPartVisitor.java,ComputerPartDisplayVisitor.java,VisitorPatternDemo.java在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行