您可以通过Math
保留字并进行以下更改来做到这一点:
语法补充
functionCall
: Identifier '(' exprList? ')' -> ^(FUNC_CALL Identifier exprList?)
| Println '(' expression? ')' -> ^(FUNC_CALL Println expression?)
| Print '(' expression ')' -> ^(FUNC_CALL Print expression)
| Assert '(' expression ')' -> ^(FUNC_CALL Assert expression)
| Size '(' expression ')' -> ^(FUNC_CALL Size expression)
| Math '.' Identifier '(' exprList ')' -> ^(FUNC_CALL Math Identifier exprList) // added
;
// ...
Math : 'Math'; // added
树语法加法
functionCall returns [TLNode node]
: ^(FUNC_CALL Identifier exprList?) {node = new FunctionCallNode($Identifier.text, $exprList.e, functions);}
| ^(FUNC_CALL Println expression?) {node = new PrintlnNode($expression.node);}
| ^(FUNC_CALL Print expression) {node = new PrintNode($expression.node);}
| ^(FUNC_CALL Assert expression) {node = new AssertNode($expression.node);}
| ^(FUNC_CALL Size expression) {node = new SizeNode($expression.node);}
| ^(FUNC_CALL Math Identifier exprList) {node = new MathCallNode($Identifier.text, $exprList.e);} // added
;
新的数学节点类
package tl.tree;
import tl.TLValue;
import java.util.ArrayList;
import java.util.List;
public class MathCallNode implements TLNode {
private String methodName;
private List<TLNode> params;
public MathCallNode(String nm, List<TLNode> ps) {
methodName = nm;
params = ps;
}
@Override
public TLValue evaluate() {
if(methodName.equals("sqrt"))
return new TLValue(Math.sqrt(params.get(0).evaluate().asDouble()));
else if(methodName.equals("min"))
return new TLValue(Math.min(params.get(0).evaluate().asDouble(), params.get(1).evaluate().asDouble()));
// TODO implement more Math-methods
else
throw new RuntimeException("unknown method: Math." + methodName + "(...)");
}
}
现在您不需要在自己的类中实现所有单独的方法,但仍然需要检查在 的方法中调用了哪个方法evaluate()
,MathCallNode
当然。
如果您现在评估:
println(Math.sqrt(9));
println(Math.min(9, -42));
将打印以下内容:
3.0
-42.0