带有占位符的简单java递归下降解析库

带有占位符的简单java递归下降解析库,java,parsing,recursive-descent,Java,Parsing,Recursive Descent,对于应用程序,我想用算术表达式和变量解析字符串。想象一下这个字符串: ((A + B) * C) / (D - (E * F)) 所以这里有占位符,没有实际的整数值/双数值。我正在搜索一个库,它允许我获取第一个占位符,将一个值(例如通过数据库查询)放入占位符,然后继续下一个占位符 所以我基本上想做的是允许用户在不知道变量的实际值的情况下用他们的域语言编写字符串。因此,应用程序将根据某些“上下文逻辑”提供数值,并输出计算结果 我在谷歌上搜索,没有找到合适的图书馆。我找到了ANTLR,但我认为它对

对于应用程序,我想用算术表达式和变量解析字符串。想象一下这个字符串:

((A + B) * C) / (D - (E * F))
所以这里有占位符,没有实际的整数值/双数值。我正在搜索一个库,它允许我获取第一个占位符,将一个值(例如通过数据库查询)放入占位符,然后继续下一个占位符

所以我基本上想做的是允许用户在不知道变量的实际值的情况下用他们的域语言编写字符串。因此,应用程序将根据某些“上下文逻辑”提供数值,并输出计算结果


我在谷歌上搜索,没有找到合适的图书馆。我找到了ANTLR,但我认为它对于我的用例来说是非常“重要的”。有什么建议吗?

你是对的,ANTLR有点过分了。但是,用中缀符号解析算术表达式并不难,请参见:


你也应该考虑使用像Groovy或JRube这样的脚本语言。JDK 6以后的版本还提供了内置的JavaScript支持。看看我的答案:。

如果你只想做简单的表达式,并且你事先知道这些表达式的语法,你甚至不需要一个库;您可以用纯Java编写简单的代码

有关如何执行以下操作的详细版本,请参见此答案:

如果用户定义他们自己的表达式语言,如果它总是以几个一元或二元运算符的形式,并且他们可以指定优先级,那么您可以通过使用具有多个优先级的运算符列表参数化解析器来改变上述答案


如果语言更复杂,您可能需要研究。

是的,有一个轻量级的即用解决方案:(但在Java中实现您自己的一组解析组合器应该相当简单)。我使用javascript方法成功地实现了我的需求。谢谢