Antlr4 Javascript访问者

时间:2016-02-16 14:18:10

标签: javascript java antlr4 visitor

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

这可能足以从...开始......

布鲁诺

修改

可能上下文是未定义的,因为我在没有参数的情况下调用该函数但是在哪里可以得到“starting”-context?

编辑2:

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

1 个答案:

答案 0 :(得分:8)

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

  1. 创建lexer,令牌,......

    angular.module('Services')
    
  2. 并调用您的输入功能

    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();
    
  3. 在你的新访问者中你需要实现你的新逻辑来确定下一个要调用的函数(正确的上下文作为参数很重要)

    visitor.visitTest(tree);
    
  4. 我希望你能理解我的基本想法。如果有人有任何问题,请发表评论。