gpt4 book ai didi

javascript - Antlr4 Javascript 访客

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:05:04 26 4
gpt4 key购买 nike

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

1:在Java中有一个Visitor.visit函数。如果我是对的,这对于 Javascript 是不可能的。有解决办法吗?

2:我的 Javascript Visitor 获得了所有生成的访问函数,但是当我使用 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();
  2. 并调用你的入口函数

    visitor.visitTest(tree);
  3. 在您的新访问者中,您需要实现新逻辑以确定接下来调用哪个函数(正确的上下文作为参数很重要)

    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());
    };

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

关于javascript - Antlr4 Javascript 访客,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35434932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com