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
}