Java 如何使用解析树和标记器在堆栈计算机上生成用于计算数学表达式的命令列表?

Java 如何使用解析树和标记器在堆栈计算机上生成用于计算数学表达式的命令列表?,java,token,lexer,stringtokenizer,parse-tree,Java,Token,Lexer,Stringtokenizer,Parse Tree,因此,我试图创建一个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+-*/()

因此,我试图创建一个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)
方法仅用于将当前令牌与允许的终端符号匹配。如果不是,则返回一个错误。我知道这远远不是我理想中想要的,但我需要的是一些东西来推动我朝着正确的方向前进。提前感谢。

你的标题基本上没有意义。字符串将包含表达式,您需要编写代码对其求值。您会推荐什么作为标题,以便我正确地说明我需要什么?我是新来的。‘生成命令列表’也没有更好。你必须写代码。别拐弯抹角了,你的头衔根本没有意义。字符串将包含表达式,您需要编写代码对其求值。您会推荐什么作为标题,以便我正确地说明我需要什么?我是新来的。‘生成命令列表’也没有更好。你必须写代码。别拐弯抹角了。