Java 如何为计算器应用运算符优先级?图书馆?ANTLR是正确的库吗?

Java 如何为计算器应用运算符优先级?图书馆?ANTLR是正确的库吗?,java,antlr,operator-precedence,Java,Antlr,Operator Precedence,我正在尝试制作一个应用运算符优先的计算器应用程序 然而,我还没有找到任何关于如何在Java中应用它的明确参考资料。我知道我可能必须使用递归下降解析器(除非有其他方法或更好的方法)。如果是这样,我自己编写解析器会更好吗?或者我应该利用图书馆 在浏览论坛时,我找到了一个建议使用ANTLR的答案,但我发现它似乎是用于语言语法,而不是在表达式中应用运算符优先级 如果我自己编写递归下降解析器更好的话,您能给我链接一些关于如何编写递归下降解析器的参考资料吗 如果我要使用一个库,请您也将我链接到一个库,并提供

我正在尝试制作一个应用运算符优先的计算器应用程序

然而,我还没有找到任何关于如何在Java中应用它的明确参考资料。我知道我可能必须使用递归下降解析器(除非有其他方法或更好的方法)。如果是这样,我自己编写解析器会更好吗?或者我应该利用图书馆

在浏览论坛时,我找到了一个建议使用ANTLR的答案,但我发现它似乎是用于语言语法,而不是在表达式中应用运算符优先级

如果我自己编写递归下降解析器更好的话,您能给我链接一些关于如何编写递归下降解析器的参考资料吗

如果我要使用一个库,请您也将我链接到一个库,并提供一些关于如何应用运算符优先级的示例

我真的不确定如何将ANTLR应用于运算符优先级,我也没有在文档中看到任何关于如何应用它的明确参考,这让我怀疑这是否是正确使用的库


谢谢

我不明白为什么要将ANTLR与运算符优先级混合。ANTLR只是一个解析器(和词法分析器)生成器。您可以使用Bison/Flex获得相同的结果

现在,如果语法本身给出了优先级(可能有一些错误,我已经看到示例执行
mult'+'mult
):

这种语法几乎自然地映射到Java代码:每个规则都是一个获取下一个标记的函数,依此类推

例如,表达式1+2*7将执行以下操作:

rule expr:
  read token '1' (from rule atom)
  read '+' read a new expr
    read '2' (from rule atom)
    read '*' -> will use rule 'mult'.
      read '7' (rule atom).

-> 1 + ( (2) * (7))

我无法解释这背后的逻辑,因为我9年前在法国学到了这一点,我并不真正需要解析器/词法分析器

我正在浏览关于如何应用运算符优先级的论坛,其中一个答案建议使用ANTLR。这就是为什么我不确定它是否正确使用的原因。如果不是ANTLR,我应该使用什么库来应用运算符优先级?这不是库的问题,而是更多地理解如何强制运算符优先级。ANTLR只是一个语法分析器生成器:它完成了这项工作,但您仍然需要编写语法。
rule expr:
  read token '1' (from rule atom)
  read '+' read a new expr
    read '2' (from rule atom)
    read '*' -> will use rule 'mult'.
      read '7' (rule atom).

-> 1 + ( (2) * (7))