0

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

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

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);
    }

}

}

控制台输入类似于:

A = 5
B = 10
C = A + B
D = C * C
print(D)

在这种情况下,控制台的输出将是 225。我的问题是我无法弄清楚如何在符号表的键和值之间拆分输入。用于输入键和值的 API 是void put(Key key, Value v)如果将键设置为 null,则删除该键。提前致谢。

4

1 回答 1

0

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

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

if(stringValue.matches("="))
{
 String[] valArray = stringValue.split("=");
}
else
{
// do something else
}

这将为您提供一个字符串数组。现在循环遍历字符串数组并检查以下条件。

2)检查是否存在numeric价值

IE: valArray[].matches("\d");

3)如果numeric存在值,检查是否存在超过1个alphabet numeric值(查看是否存在超过1个变量)

这是为了检查字母表是否存在于任何拆分字符串中>> valArray[].matches("\D");

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)如果=不存在,则检查print字符串并执行打印操作。

IE:

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

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

于 2013-05-06T00:56:10.273 回答