java - 返回值在函数之间变化

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

最佳答案

好吧,我终于明白了。

在我的 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/

相关文章:

java - 如何禁用 Spring Data MongoDB 文档的字段映射?

java - JTable 与innerJoin 语句结合

java - 在运行时更改 TreeMap 的比较器

postgresql - 在 PostgreSQL 中递归聚合父级

java - While 循环并检查静态变量

java - JSoup 解析标签内的数据

r - 使用 pdftools 在 R 中按段落解析 PDF

c - 解析器的左联想语法

Python-递归-编程新手

file - Powershell,大规模移动某种类型的文件