首先,我会直截了当地说这是一个家庭作业问题。
我必须使用以下代码作为基础来构建表达式解析器: 编辑:
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,则删除该键。提前致谢。