ANTL3中面向Javascript的表达式解析器
我已经开始玩ANTL3了,我发现它非常酷,它对多种语言的支持非常棒 现在我正在试验Javascript。我已经扩展了找到的语法@ 我允许我的用户调用他在javascript中定义的函数,例如:ANTL3中面向Javascript的表达式解析器,javascript,antlr,antlr3,abstract-syntax-tree,parse-tree,Javascript,Antlr,Antlr3,Abstract Syntax Tree,Parse Tree,我已经开始玩ANTL3了,我发现它非常酷,它对多种语言的支持非常棒 现在我正在试验Javascript。我已经扩展了找到的语法@ 我允许我的用户调用他在javascript中定义的函数,例如: function sum(args){ var s=0; for(var i=0;i<args.length;i++) s+=args[i]; return s; } function avg(args){ var s=sum(args);
function sum(args){
var s=0;
for(var i=0;i<args.length;i++)
s+=args[i];
return s;
}
function avg(args){
var s=sum(args);
return s/args.length;
}
但是,当我尝试评估时:
sum(2+3,4+7,sum(4,5,6),avg(4,4,4,4))
它越来越失败了
请帮助我编写适当的AST walker来计算多值函数
提前感谢。在树语法的
调用
规则中,您应该推送exp*
的计算值。目前,您正在将实际的AST推送到params
数组中
将您的呼叫规则更改为:
call returns [value]
: {
var params = [];
}
^(FUNC IDENT (exp {params.push($exp.expr);})*)
{
var fn = $IDENT.text;
var method = fn + '([' + params + '])';
value = eval(method);
}
;
现在,表达:
sum(2+3,4+7,sum(4,5,6),avg(4,4,4,4))
将被评估为:
35
call returns [value]
: {
var params = [];
}
^(FUNC IDENT (exp {params.push($exp.expr);})*)
{
var fn = $IDENT.text;
var method = fn + '([' + params + '])';
value = eval(method);
}
;
sum(2+3,4+7,sum(4,5,6),avg(4,4,4,4))
35