表达解析器与堆栈和符号表

时间:2013-05-06 00:21:56

标签: 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>();
    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,则删除键。谢谢你提前。

1 个答案:

答案 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是您的控制台输入行。