递归下降解析Java——递归的思想

递归下降解析Java——递归的思想,java,parsing,math,recursion,expression,Java,Parsing,Math,Recursion,Expression,我的大学作业如下。我需要关于递归的帮助,因为我不太明白递归在这里是如何工作的。 我将输入字符串(类似于“((a+b)(22+3))”解析为数组列表。结果看起来像“(“a”+“b”)(“22”+“3”)”。现在我有以下to函数,它们应该解析每个表达式。(TreeKnot是一个具有一个节点和两个叶子的二叉树,函数nextSymbol()只是将currentSymbol设置为数组列表中的下一个符号)-请注意,函数尚未完成,因为最简单的事情无法工作 TreeKnot left = term();

我的大学作业如下。我需要关于递归的帮助,因为我不太明白递归在这里是如何工作的。 我将输入字符串(类似于“((a+b)(22+3))”解析为数组列表。结果看起来像“(“a”+“b”)(“22”+“3”)”。现在我有以下to函数,它们应该解析每个表达式。(TreeKnot是一个具有一个节点和两个叶子的二叉树,函数nextSymbol()只是将currentSymbol设置为数组列表中的下一个符号)-请注意,函数尚未完成,因为最简单的事情无法工作

    TreeKnot left = term(); 
    if(currentSymbol.equals("+")){ 
        nextSymbol(); 
        TreeKnot right = term();
        return new TreeKnot(left, right, "+");
    } else if(currentSymbol.equals("*")){
        nextSymbol();
        TreeKnot right = term();
        return new TreeKnot(left, right, "*"); 
    }   else {
        return left;
    }
}   
在下一个函数中,我尝试递归地解析该术语,这样,如果打开一个新的括号,我将再次解析表达式

private TreeKnot term(){
    if(currentSymbol.contains("(")){
        nextSymbol();
        ausdr();
    }else if(currentSymbol.matches("(\\d)|([a-zA-Z])")){
        nextSymbol();
        return new Terminal(null,null,leftOver.get(symbi-1));
    }else if(currentSymbol.contains(")")){
        nextSymbol();
        ausdr();
    }
    return new TreeKnot(null,null,null);
}
使用上面提到的表达式,解析a+3可以很好地工作,但是他再次跳入ausdr()并返回null,而不是提前一步。我不想让你做我的家庭作业,但也许有人能把我引向正确的方向。另一件我不明白的事情是,我如何防止它跳入“returnnewtreeknot(null,null,null)”的情况?我认为,我没有跳进正确的位置,或者我错过了一些跳转


提前谢谢。

这难道不是令人讨厌的代码吗

 }else if(currentSymbol.contains(")")){
        nextSymbol();
        ausdr();
    }
如果您已完成一个术语,则希望返回该术语。我不确定
TreeKnot
的字段是什么,但您似乎希望在此处创建一个