首先,我会坦率地说这是一个家庭作业问题。
我必须使用以下代码构建表达式解析器作为我的基础: 修改
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,则删除键。谢谢你提前。
答案 0 :(得分:0)
这不仅仅是字符串拆分,您还需要其他检查,例如:
1)根据=
模式
if(stringValue.matches("="))
{
String[] valArray = stringValue.split("=");
}
else
{
// do something else
}
这将为您提供一个字符串数组。现在循环遍历字符串数组并检查以下条件。
2)检查是否存在numeric
值
即: valArray[].matches("\d");
3)如果存在numeric
值,请检查是否存在超过1次出现的alphabet numeric
值(以查看是否存在多于1个变量)
这是为了检查任何分裂字符串中是否存在字母&gt;&gt; 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
并执行打印操作。
即:
if(stringValue.matches("print"));
{
//Do something
}
注意: stringValue
是您的控制台输入行。