我想确定给定的字符串是否是有效的Java表达式(根据Java的语法)。
例如:
object.apply()
x == 2
(x != null) && x.alive
是Java中的所有有效表达式。 但是:
object.apply();
==
for(int i=1; i < n; ++i) i.print();
在Java中不是有效的表达式(有些是有效的陈述,但这不是我正在寻找的)。
有简单的解决方案吗? (比如isJavaIdentifierStart
和isJavaIdentifierPart
,当想要确定字符串是否是有效的标识符时)
答案 0 :(得分:3)
您需要按照Java语言标准规范解析表达式,就像Java编译器解析表达式一样。
从头开始构建自己的解析器不是一个好主意; Java语法在过去十年变得复杂了。您应该找到一个现有的Java解析器并重复使用,这样您就不必错误地重新发明轮子。
JavaCC和ANTLR都以Java形式提供,并为它们定义了Java语法。我建议你把它们当作主要候选人。复杂的是,这些解析器解析完整的程序,而不是表达式。你可以通过修改语法来使表达成为目标规则,然后修复可能产生的任何语法冲突来解决这个问题;我不会期待太多。
一个更复杂的问题:仅仅因为语法有效,并不意味着表达式是有效的。我很确定java的语法会接受:
"abc" * 17.2
作为有效的语法。
如果要验证表达式的有效性,则必须键入它,使用将在其中评估表达式的上下文来提供背景类型信息。否则,人们会认为这是有效的:
s * d // expression that parses correctly, but isn't valid
当背景知识是这样的时候:
Object s;
char d;
进行完整的类型检查要困难得多。实际上,您需要一个完整的Java编译器前端,它可以解析并进行类型检查。 解析器生成器(例如,ANTLR,JavaCC)提供零帮助。
因此,您要么使用Java编译器,要么搜索Java前端;有几个。 [完全披露:我公司提供的可以做到这一点]。
答案 1 :(得分:1)
不,绝对不是检查String是否是有效Java代码的简单方法。我只想到两种方式。
<强> 1。导出到文件并进行编译
您可以将String保存为带有.java
后缀的文件并进行编译。根据编译结果,您可以说String是否有效。
<强> 2。 Java解析器
你可能会发现一个能够做到这一点的图书馆。看看JavaCC。我在这里引用他们的网站:
解析器生成器是一种读取语法规范并将其转换为可识别与语法匹配的Java程序的工具。
答案 2 :(得分:1)
&#34;有效Java表达式的概念&#34;是...橡皮。
例如:
1 == true
在语法上是有效的,但Java编译器会拒绝它,因为==
不能与具有这些类型的操作数一起使用。然后:
x.length() == 42
可能有效,也可能无效,具体取决于x
的声明类型。
如果您只是对表达式在语法上是否有效感兴趣,那么Java语言子集的解析器就足够了。
另一方面,如果要在嵌入Java程序时检查表达式是否可编译,那么最简单的方法是将表达式嵌入到等效的上下文中,并使用真正的Java编译器进行编译。
答案 3 :(得分:-1)
您可以使用ANTLR
创建解析器您可以定义自己的规则。