2016-02-16 49 views
2

我目前正在嘗試在Antlr4訪問者的幫助下開發JavaScript編譯器。我已經用Java實現了這一點,但無法弄清楚如何在JavaScript中執行此操作。可能有人可以回答我幾個問題?Antlr4 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(); 

這大概是足以開始...

布魯諾

編輯:

可能上下文是未定義的,因爲我沒有參數調用該函數,但我在哪裏可以獲得「開始」-context?

EDIT2:

所以我覺得我的想法這應該如何工作的。還有一個問題我如何確定在每個訪問者函數內接下來調用哪個規則?

+0

不知道,但也許你可以在antlr討論谷歌組獲得答案。不要忘記添加您的語法文件和您開發的一些訪客代碼。 – erosb

+0

你是對的,在Java中它使用方法重載。由於在JavaScript中不可行,因此會生成'visitXXX',其中XXX是規則名稱。你仍然有一個每個規則的函數,它是區分它們的名字,而不是它們的參數類型。順便說一下,你也可以顯示一些代碼。 – Katona

+0

找到解決方案如果有人感興趣,他可以給我寫信息 – Bruno

回答

4

訪客背後的基本理念是你必須自己處理所有的邏輯。爲此,我使用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()); 
    }; 
    

我希望你能理解我的基本想法。如果任何人有任何問題只是評論。

+1

我認爲這個職位:http://stackoverflow.com/questions/36758475/antlr4-javascript-target-issue-with-visitor-and-labeled-alternative是實施js訪客非常有用。 – Ariex