我正在使用这种语法制作一个递归的正确解析器。
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只能看到“/”。我已经坐下来试图找出我的问题,但我想我可能对这两种方法如何传递参数有一个基本的错误理解。我也有一种感觉,因为递归。如果我自己弄明白,我会自己回答这个问题。提前致谢。
答案 0 :(得分:1)
好吧,我终于明白了。
在我的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方法时,我没有使用正确的构造函数,所以我丢失了一些信息,因此只获得了根。我是二元树&Recursion / AST的新手,在使用这些工具时有时会忘记BIG图片。