1

所以我正在尝试创建一个CalcParser类,当给定一个数学表达式时,它会生成一个字符串,其中包含用于在堆栈机器上评估表达式的命令。例如,1+2*3 应该输出:

推 1.0
推 2.0
推 3.0

此外,必须遵守括号。所以 (1+2)*3 应该输出:

推 1.0
推 2.0

推 3.0

我正在使用一个预先存在的CalcLexer类,该类保存正在解析的字符串并使用java.util.StringTokenizer. 此类所需的唯一信息是运算符\t\n\r+-*/()空格也被视为单独的标记。

这是我的问题。如果我使用解析树生成输出代码,我将如何考虑括号,因为括号内的表达式总是首先完成?到目前为止,这是我对该parseRootexp()方法的了解,我觉得我有点不对劲:

private double value;
private CalcLexer lexer = new CalcLexer();
private void parseRootexp(){
    if (lexer.nextToken() == '('){
        match('(');
        do{
            lexer.nextToken();
            if (lexer.nextToken() == CalcLexer.NUMBER_TOKEN){
                value = lexer.getNum();
                System.out.println("push " + value + "\n");
            }   
        } while (lexer.nextToken() != ')');
    }
}

match(int token)方法仅用于将当前令牌与允许的终端符号匹配。如果不是,则返回错误。我知道这远非我想要的理想,但我需要的是把我推向正确方向的东西。提前致谢。

4

0 回答 0