Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ANTL3中面向Javascript的表达式解析器_Javascript_Antlr_Antlr3_Abstract Syntax Tree_Parse Tree - Fatal编程技术网

ANTL3中面向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);

我已经开始玩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);
    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