函数之间的返回值变化

时间:2018-03-18 01:48:23

标签: java parsing recursion return abstract-syntax-tree

我正在使用这种语法制作一个递归的正确解析器。

     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只能看到“/”。我已经坐下来试图找出我的问题,但我想我可能对这两种方法如何传递参数有一个基本的错误理解。我也有一种感觉,因为递归。如果我自己弄明白,我会自己回答这个问题。提前致谢。

1 个答案:

答案 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图片。