我正在用这个语法制作一个递归的像样的解析器。
Expr -> Term ( '+' | '-' ) Expr | Term
Term -> Number ( '*' | '/' ) Term | Number
Number -> any valid Java double
我的 getTerm 方法如下所示。
private static BTree getTerm(Tokenizer tokens)
{
String tokenHold = "";
BTree result = new BTree(getNumber(tokens).getElement());
System.out.println("VALUE of result : " + result.toString());
while(tokens.hasToken() && ("*/".indexOf(tokens.peekToken()) != -1)){
BTree newTree = null;
boolean isMulti = false;
boolean isDiv = false;
if(tokens.peekToken().equals("*")){
isMulti = true;
}
if(tokens.peekToken().equals("/")){
isDiv = true;
}
if(isMulti) {
newTree = new BTree( "*" );
}
else if(isDiv){
newTree = new BTree( "/" );
}
tokenHold = tokens.nextToken();
newTree.addLeftTree(result);
newTree.addRightTree(getTerm(tokens));
result = newTree;
}
System.out.println("Expression of result : " + result.toString());
return result;
}
它返回到 getExpr 方法,如下所示
private static BTree getExpr(Tokenizer tokens)
{
String tokenHold = "";
BTree result = new BTree(getTerm(tokens).getElement());//consumes term
System.out.println("Expression of result in getExpr: " + result.toString());
while(tokens.hasToken() && ("+-".indexOf(tokens.peekToken()) != -1)){
BTree newTree = null;
boolean isAdd = false;
boolean isSub = false;
if(tokens.peekToken().equals("+")){isAdd = true;}
if(tokens.peekToken().equals("-")){isSub = true;}
if(isAdd){ newTree = new BTree( "+" );}
else if(isSub){ newTree = new BTree( "-" );}
tokenHold = tokens.nextToken();
newTree.addRightTree(result);
newTree.addLeftTree(getTerm(tokens)); // old tree on the right
result = newTree;
}
return result;
}
BTree 的构造函数
public BTree(String element)
{
this.element = element;
left = null;
right = null;
}
public BTree(String element, BTree left, BTree right)
{
this.element = element;
this.left = left;
this.right = right;
}
当我输入这个语法 4/2/2 时。 getTerm 方法返回正确的值“(/4 (/2 2)) ”,但 getExpr 只看到“/”。我坐下来试图解决我的问题,但我认为我可能对这两种方法如何传递参数有一个根本性的误解。我也有一种感觉,这是因为递归。如果我自己弄清楚的话,我会自己回答这个问题。提前致谢。
最佳答案
好吧,我终于明白了。
在我的 getExpr 方法中,我使用了一个构造函数,该构造函数没有包含在二叉树的原始问题中,它看起来像这样
public BTree(String element)
{
this.element = element;
left = null;
right = null;
}
我应该使用具有树的左子节点和右子节点的构造函数。这个构造函数看起来像这样。
public BTree(String element, BTree left, BTree right)
{
this.element = element;
this.left = left;
this.right = right;
}
因为在将此值从 getTerm 方法传递到 getExpr 方法时我没有使用正确的构造函数,所以我丢失了一些信息,因此只获得了根。我对二叉树/递归/AST 很陌生,在使用这些工具时有时会忘记大局。
关于java - 返回值在函数之间变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49343760/