所以我正在尝试创建一个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)
方法仅用于将当前令牌与允许的终端符号匹配。如果不是,则返回错误。我知道这远非我想要的理想,但我需要的是把我推向正确方向的东西。提前致谢。