我正在爲類創建解析器。用戶必須在每個元素之間輸入空格。然後將每個元素讀入它自己的索引中的同一個數組中。我一直在堆棧溢出。我認爲這是因爲只有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);
}
}
}
我認爲你應該將你的新解決方案分解成一個新問題。任何需要稍後閱讀的人都無法理解這些答案。關於StackOverflow的問題應該是其他類似問題的公共資源。 – RealSkeptic 2014-10-27 20:19:40
好的,我有。感謝您的建議。 – 2014-10-27 20:29:28