【问题标题】:Return value changing between functions返回值在函数之间变化
【发布时间】:2018-08-26 21:06:24
【问题描述】:

我正在用这个语法做一个像样的递归解析器。

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

【问题讨论】:

  • 使用循环和递归看起来很痛苦。
  • 你的权利我想我会尝试用 if 语句来实现。得到答案后我会更新答案。

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


【解决方案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 方法时我没有使用正确的构造函数,所以我丢失了一些信息,因此只能获取根。我是二叉树 / 递归 / AST 的新手,使用这些工具时有时会忘记全局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-19
    • 2019-11-12
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多