gpt4 book ai didi

java - 如何修复自制解析器中的堆栈溢出?

转载 作者:行者123 更新时间:2023-12-01 12:22:19 24 4
gpt4 key购买 nike

我正在为类创建一个解析器。用户必须输入方程,每个元素之间有一个空格。然后将每个元素读入其自己索引中的同一数组中。我不断遇到堆栈溢出。我认为这是因为只有 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);
}
}
}

最佳答案

Java 中的参数是按值传递的,而不是按引用传递的。

您的方法都没有返回值。您似乎期望 solved 将包含最终值,但事实并非如此,因为它是按值传递的。

出于同样的原因,实际上没有必要使用所有 ++ 运算符。您应该将 o+1 传递到较低级别。它不会影响递归上层的“o”变量!

最后,myCalculus 方法中的 while 循环没有任何意义,因为您在其他方法内部进行递归。所以while只会导致计算错误。

另请注意,您对括号的处理可能是错误的。您没有在任何地方处理右括号,这也可能会导致错误的计算。

关于java - 如何修复自制解析器中的堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26586877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com