【问题标题】:Expression Parser with Stacks and Symbol Tables带有堆栈和符号表的表达式解析器
【发布时间】:2013-05-06 00:21:55
【问题描述】:

首先,我会直截了当地说这是一道作业题。

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

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,则删除该键。提前致谢。

【问题讨论】:

    标签: java stack symbol-table


    【解决方案1】:

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

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

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

    这会给你一个字符串数组。现在循环遍历字符串数组并检查以下条件。

    2) 检查是否存在numeric

    即: 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 并执行打印操作。

    即:

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

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

    【讨论】:

    • 我试过了,但我无法让拆分工作。我编辑了我的问题以反映我创建的代码的合并。调试代码的时候发现不管怎么做,第一个参数都被标识为Stack,第二个参数被分解成一个数组S t a c k,每个字母都是s.Array[]的一个元素。不管你是否及时看到这个,谢谢你的帮助。
    • 第一个参数为Stack,第二个参数为S T a c k?那是在您控制台输入之后吗?你的控制台输入是什么?
    • 我的控制台输入第一次是A = 5B = 10C = A + BD = C * Cprint(D),每个块在单独的输入行上。然后我尝试了A = 5。每次结果都一样。
    • 那么stackS t a c k是从哪里来的?
    • 我不知道。当我在 Eclipse 中运行调试器时,变量窗格始终具有 args0 和 args1,无论控制台的输入如何。无论哪种方式,我都废弃了旧的main() 并开始从头开始实施您的步骤。我发布了编辑。
    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多