Antlr4 Javascript访问者

我目前正在尝试在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();

这可能足以从…开始

布鲁诺

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

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

回答:

访问者背后的基本思想是,您必须自己处理所有逻辑。为此,我使用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());

};

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

以上是 Antlr4 Javascript访问者 的全部内容, 来源链接: utcz.com/qa/412928.html

回到顶部