所以我通过JISON生成了一个解析器:
// mygenerator.js
var Parser = require("jison").Parser;
// a grammar in JSON
var grammar = {
"lex": {
"rules": [
["\\s+", "/* skip whitespace */"],
["[a-f0-9]+", "return 'HEX';"]
]
},
"bnf": {
"hex_strings" :[ "hex_strings HEX",
"HEX" ]
}
};
// `grammar` can also be a string that uses jison's grammar format
var parser = new Parser(grammar);
// generate source, ready to be written to disk
var parserSource = parser.generate();
// you can also use the parser directly from memory
// returns true
parser.parse("adfe34bc e82a");
// throws lexical error
parser.parse("adfe34bc zxg");
我的问题是,现在如何检索AST?我可以看到我可以对输入运行解析器,但是如果它可以工作,它只会返回true,否则将失败。
作为记录,我使用的是JISON:http://zaach.github.com/jison/docs/
最佳答案
我对Jison的内部运作不太熟悉,所以我不知道有什么方法可以做到。
但是,如果您有兴趣解决此问题,可以尝试以下方法:
首先,创建一个对象来保存AST
function jisonAST(name, x) { this.name = name; this.x = x; }
// return the indented AST
jisonAST.prototype.get = function(indent){
// create an indentation for level l
function indentString(l) { var r=""; for(var i=0;i<l;i++){r+=" "}; return r }
var r = indentString(indent) + "["+this.name+": ";
var rem = this.x;
if( rem.length == 1 && !(rem[0] instanceof jisonAST) ) r += "'"+rem[0]+"'";
else for( i in rem ){
if( rem[i] instanceof jisonAST ) r += "\n" + rem[i].get(indent+1);
else { r += "\n" + indentString(indent+1); r += "'"+rem[i]+"'"; }
}
return r + "]";
}
为Jison的BNF添加一些辅助功能
function o( s ){
r = "$$ = new yy.jisonAST('"+s+"',[";
for( i = 1; i <= s.split(" ").length; i++ ){ r += "$"+i+"," }
r = r.slice(0,-1) + "]);";
return [s,r];
}
这样,继续执行示例代码(稍作修改):
var Parser = require("jison").Parser;
// a grammar in JSON
var grammar = {
"lex": {
"rules": [
["\\s+", "/* skip whitespace */"],
["[a-f0-9]+", "return 'HEX';"]
]
},
"bnf": {
// had to add a start/end, see below
"start" : [ [ "hex_strings", "return $1" ] ],
"hex_strings" :[
o("hex_strings HEX"),
o("HEX")
]
}
};
var parser = new Parser(grammar);
// expose the AST object to Jison
parser.yy.jisonAST = jisonAST
现在您可以尝试解析:
console.log( parser.parse("adfe34bc e82a 43af").get(0) );
这将为您提供:
[hex_strings HEX:
[hex_strings HEX:
[HEX: 'adfe34bc']
'e82a']
'43af']
小提示:我必须添加一个“开始”规则,以便只有一条语句返回结果。这不是干净的(因为BNF没有它可以正常工作)。将其设置为切入点,以确保...
关于javascript - 如何从JISON解析器中获取抽象语法树(AST)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8467150/