2014-10-27 56 views
0

我正在爲類創建解析器。用戶必須在每個元素之間輸入空格。然後將每個元素讀入它自己的索引中的同一個數組中。我一直在堆棧溢出。我認爲這是因爲只有myCalculus函數的最後一次調用纔會真正關閉。雖然如此,但我不確定如何組織代碼來避免這種情況。預先感謝您的幫助。如何解決自制解析器中的堆棧溢出問題?

import java.util.Scanner; 

public class InterpreterFour{ 
    public static void main(String []args){ 
    //read in the values as a string 
    Scanner scan = new Scanner(System.in); 
    String expressions = scan.nextLine(); 
    //save each token into the array 
    String[] token = expressions.split("\\s+"); 

    int solved = 0; 
    int o = 0; 
    //call myCalculus function which will call the other functions 
    System.out.println(myCalculus(token, 0, solved)); 
    } 

    public static int myCalculus(String[] token, int o, int solved){ 
     while(o < token.length-1){ 
      if(token[o].equals("*")){ 
       multiply(token, o, solved); 
      } 
      else if(token[o].equals("+")){ 
       add(token, o, solved); 
      } 
      else if(token[o].equals("<")){ 
       compare(token, o, solved); 
      } 
      else if(token[o].equals("<=")){ 
       compare(token, o, solved); 
      } 
      else if(token[o].equals(">")){ 
       compare(token, o, solved); 
      } 
      else if(token[o].equals("<=")){ 
       compare(token, o, solved); 
      } 
      else if(token[o].equals("(")){ 
       myCalculus(token, o++, solved); 
      } 
      else{ 
       myCalculus(token, o++, solved); 
      } 
     } 
     return solved; 
    } 

    public static void add(String[] token, int o, int solved){ 
     if(token[o++].matches("[-+]?\\d*\\.?\\d+")){ 
      solved = solved + Integer.parseInt(token[o--]) + Integer.parseInt(token[o++]); 
      myCalculus(token, o++, solved); 
     } 
     else{ 
      myCalculus(token, o++, solved); 
     } 
    } 

    public static void multiply(String[] token, int o, int solved){ 
     if(token[o++].matches("[-+]?\\d*\\.?\\d+")){ 
      solved = solved + Integer.parseInt(token[o--]) * Integer.parseInt(token[o++]); 
      myCalculus(token, o++, solved); 
     } 
     else{ 
      myCalculus(token, o++, solved); 
     } 
    } 

    public static void compare(String[] token, int o, int solved){ 
     if(token[o++].matches("[-+]?\\d*\\.?\\d+")){ 
      if(token[o].equals("<")){ 
       solved = solved + ((Integer.parseInt(token[o--]) < Integer.parseInt(token[o++])) ? 1 : 0); 
      } 
      else if(token[o].equals(">")){ 
       solved = solved + ((Integer.parseInt(token[o--]) > Integer.parseInt(token[o++])) ? 1 : 0); 
      } 
      else if(token[o].equals("<=")){ 
       solved = solved + ((Integer.parseInt(token[o--]) <= Integer.parseInt(token[o++])) ? 1 : 0); 
      } 
      else{ 
       solved = solved + ((Integer.parseInt(token[o--]) >= Integer.parseInt(token[o++])) ? 1 : 0); 
      } 
      myCalculus(token, o++, solved); 
     } 
     else{ 
      myCalculus(token, o++, solved); 
     } 
    } 
} 
+0

我認爲你應該將你的新解決方案分解成一個新問題。任何需要稍後閱讀的人都無法理解這些答案。關於StackOverflow的問題應該是其他類似問題的公共資源。 – RealSkeptic 2014-10-27 20:19:40

+0

好的,我有。感謝您的建議。 – 2014-10-27 20:29:28

回答

0

我認爲你需要改變你的遞歸調用使用++o而非o++

myCalculus(token, ++o, solved); 

您當前的代碼將只在調用之後。所以每當你遇到一個支架代碼增加omyCalculus將進入無限循環。

+0

這確實解決了這個問題。但是,現在,沒有解決方案永遠不會返回。 – 2014-10-27 12:06:18

1

Java中的參數按值傳遞,而不是通過引用傳遞。

您的方法都不會返回任何值。您似乎預計solved將包含最終值,但它不會,因爲它是按值傳遞的。

出於同樣的原因,實際上並不需要所有的++運營商。你應該把o + 1傳遞給下層。它不會影響遞歸上層的「o」變量!

最後,在myCalculus方法的while循環中沒有任何意義,因爲您在其他方法中進行遞歸。所以這一次只會導致計算錯誤。

另請注意,您對圓括號的處理可能是錯誤的。你沒有在任何地方處理右括號,這可能也會導致計算錯誤。