Bru*_*uno 6 javascript java visitor antlr4
我目前正在尝试在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);
};
Run Code Online (Sandbox Code Playgroud)
主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();
Run Code Online (Sandbox Code Playgroud)
这可能足以从......开始
布鲁诺
编辑:
可能上下文是未定义的,因为我在没有参数的情况下调用函数,但是我从哪里得到"起始" - 上下文?
EDIT2:
所以我想我知道这应该如何解决.还有一个问题我如何确定每个访问者函数中下一个要调用的规则?
访问者背后的基本思想是你必须自己处理所有的逻辑.为此,我使用antlr生成了访问者.我自己的访问者覆盖了实现逻辑所需的所有功能.
创建词法分析器,令牌,......
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();
Run Code Online (Sandbox Code Playgroud)并调用您的输入功能
visitor.visitTest(tree);
Run Code Online (Sandbox Code Playgroud)在新访问者中,您需要实现新逻辑以确定下一个要调用的函数(正确的上下文作为参数很重要)
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());
};
Run Code Online (Sandbox Code Playgroud)我希望你能理解我的基本想法.如果有人有任何问题只需评论.
| 归档时间: |
|
| 查看次数: |
2102 次 |
| 最近记录: |