Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有堆栈和符号表的表达式解析器_Java_Stack_Symbol Table - Fatal编程技术网

Java 具有堆栈和符号表的表达式解析器

Java 具有堆栈和符号表的表达式解析器,java,stack,symbol-table,Java,Stack,Symbol Table,首先,我要直截了当地说这是一个家庭作业问题 我必须使用以下代码作为基础构建表达式解析器: 编辑: public class Interpreter { public static Double parser(ST<String, Double> variables, String[] inputArray) { Double valueHolder; Stack<String> ops = new Stack<String>(

首先,我要直截了当地说这是一个家庭作业问题

我必须使用以下代码作为基础构建表达式解析器: 编辑:

public class Interpreter {

public static Double parser(ST<String, Double> variables, String[] inputArray)
{       
    Double valueHolder;

    Stack<String> ops = new Stack<String>();
    Stack<Double> vals = new Stack<Double>();

    for(int i = 0; i < inputArray.length; i++)
    {
        String input = inputArray[i];

        if  (input.equals("("))                        ;
        else if (input.equals("+"))     ops.push(input);
        else if (input.equals("-"))     ops.push(input);
        else if (input.equals("*"))     ops.push(input);
        else if (input.equals("/"))     ops.push(input);
        else if (input.equals("sqrt"))  ops.push(input);

        else if (input.equals(")")) 
        {   
            String op = ops.pop();
            double v = vals.pop();
            if      (op.equals("+"))    v = vals.pop() + v;     
            else if (op.equals("-"))    v = vals.pop() - v;
            else if (op.equals("*"))    v = vals.pop() * v;
            else if (op.equals("/"))    v = vals.pop() / v;
            else if (op.equals("sqrt")) v = Math.sqrt(v);
            vals.push(v);
        }
        else if (input.matches("\\D"))
            {
                valueHolder = variables.get(inputArray[i]);
                vals.push(valueHolder);
            }
        else vals.push(Double.parseDouble(input));
    }

    return vals.pop();
}

public static String[] getValue(ST<String, Double> variables, String[] inputArray)
{
    Double keyHolder;
    Double valueHolder;

    for(int i = 0; i < inputArray.length; i++)
    {
        if(variables.contains(inputArray[i]))
            {
                keyHolder = variables.get(inputArray[i]);
                inputArray[i] = keyHolder.toString();
            }
        else if (!variables.contains(inputArray[i]))
        { if (inputArray[i].matches("\\D")) //if letter
            { if (!inputArray[i].equals("=")) //if not "="
                {for (int j = i + 1; j < inputArray.length; j++) //next element
                    { if (inputArray[j].matches("\\D")) //if letter
                        {if (!inputArray[j].matches("=")) //if not "="
                            {

                                //get values and do math
                            }
                        }
                    else if (inputArray[j].matches("\\d")) // if digit
                    { if (j + 1 >= inputArray.length)
                        {
                            valueHolder = Double.parseDouble(inputArray[j]);
                            variables.put(inputArray[i], valueHolder);
                        }
                      else parser(variables, inputArray); //if 
                    }
                    }
                }
            }

        }
    }

    return inputArray;
}

public static void main(String[] args)
{
    ST<String, Double> variables = new ST<String, Double>();

    while(!StdIn.isEmpty())
    {
        String input = StdIn.readLine();
        String[] inputArray = input.split("\\s+");          // read a line and split it by whitespace
        inputArray = getValue(variables, inputArray);       // remove any variables and replace with their associated values
        double y = parser(inputArray);  
        System.out.println(y);
    }

}

在这种情况下,控制台的输出为225。我的问题是我不知道如何在符号表的键和值之间分割输入。用于输入键和值的API是
void put(键,值v)
,其中如果键设置为null,则移除键。感谢高级版。

这不仅仅是字符串拆分,您还需要其他检查,如:

1)根据
=
模式拆分字符串

if(stringValue.matches("="))
{
 String[] valArray = stringValue.split("=");
}
else
{
// do something else
}
这将为您提供一个字符串数组。现在循环字符串数组并检查以下条件

2)检查是否存在
数值

ie:
valArray[]匹配(“\d”)

3)如果存在
数值
值,检查出现的
字母数字
值是否超过1次(查看出现的变量是否超过1个)

这是为了检查字母表是否存在于任何拆分字符串中

4)最后,如果只存在1个数字值和1个字母数字值,则存储键和值

5)如果出现的空变量超过1次,则需要跳过该操作(加号、减号…),直到键值数组中存在变量值

You can check this by checking your key-value pair array. You don't store key-value if the value if empty.
6)如果
=
不存在,则检查字符串中的
打印
,然后执行打印操作

即:

if(stringValue.matches("print"));
{
//Do something
}

注意:
stringValue
是您的控制台输入行

我试过了,但我没能让这两件事顺利进行。我编辑了我的问题,以反映我创建的代码的合并。当我调试代码时,我发现无论我做什么,第一个参数都被标识为
Stack
,第二个参数被分解成一个数组
S t a c k
,每个字母都是
S.array[]
的一个元素。不管您是否及时看到,谢谢您的帮助。第一个参数是
Stack
,第二个参数是
Stack
?那是在你控制台输入之后吗?您的控制台输入是什么?我的控制台输入第一次是
A=5
B=10
C=A+B
D=C*C
打印(D)
,每个块在单独的输入行上。然后我就试着把A=5。每次都是相同的结果。那么
堆栈
S t a c k
来自哪里?我不知道。当我在Eclipse中运行调试器时,无论控制台的输入是什么,变量窗格总是有args0和args1。不管怎样,我都放弃了旧的
main()
,开始从头开始实施您的步骤。我发布了编辑。
if(stringValue.matches("print"));
{
//Do something
}