Java-解析伪代码字符串并验证语法
假设我有以下字符串:Java-解析伪代码字符串并验证语法,java,parsing,syntax-error,Java,Parsing,Syntax Error,假设我有以下字符串: if(something){/*dostuff*/}else if(something){/*doother stuff*/}else{/*dostuff再做一次*} 我想要的是验证这个字符串中的if语法是否正确。例如,确保else{}语句不在else if(){}语句之前,或者括号没有打开等等……我不关心括号内的代码。字符串可以有任意数量的“if-else”语句,也可以有或没有“else”语句 我已经编写了一个函数来检查它,但是如果有这样的库或脚本,我更愿意使用它。您可以
if(something){/*dostuff*/}else if(something){/*doother stuff*/}else{/*dostuff再做一次*}
我想要的是验证这个字符串中的if语法是否正确。例如,确保else{}语句不在else if(){}语句之前,或者括号没有打开等等……我不关心括号内的代码。字符串可以有任意数量的“if-else”语句,也可以有或没有“else”语句
我已经编写了一个函数来检查它,但是如果有这样的库或脚本,我更愿意使用它。您可以尝试使用它构建自己的解析器
但是,如果您不关心括号内的代码,那么这可能是过分的。正如Gregor所写,虽然构建自己的解析器是最完整的解决方案,但是可以使用正则表达式执行有限的语法检查。您可以使用。有几种脚本引擎,适用于JavaScript,也适用于BeanShell,一种简化的Java,只适用于这种零碎的代码
ScriptEngineManager factory = new ScriptEngineManager();
ScriptEngine engine = factory.getEngineByName("BeanShell");
try {
engine.eval("int if = -1;");
} catch (ScriptException e) {
grrrr(e);
}
如果您只想检查语法,可以使用一些现有的Java代码解析器,如 例如:
final String classText = text + "\n" + "public class Dummy{}";
final StringReader reader = new StringReader(classText);
final CompilationUnit compilationUnit = JavaParser.parse(reader, true);
这似乎有点不同,因为它试图检查一条语句,而不是编译一个完整的类。我正在尝试验证我自己制作的一小段孤立伪代码中的语法。我正在尝试您的方法,我导入了ScriptEngineManager库,但当您的代码段运行时,它会在engine=factory.getEngineByName(“BeanShell”)抛出一个空异常;您能告诉我如何将BeanShell导入ScriptEngineManager吗?是一个由来已久的脚本引擎。我有很多年没看它了。它与其他语言一起列出。BeanShell本身有很好的文档,并提到了嵌入。你必须为我看到的BeanShell注册工厂-对不起。我担心BeanShell脚本可能是一个二级项目。