【问题标题】:Java - parse string of pseudo code and verify syntax [duplicate]Java - 解析伪代码字符串并验证语法
【发布时间】:2015-05-31 14:43:53
【问题描述】:

假设我有以下字符串:

if(something){ /* do stuff */ }else if(something_else){ /* do other stuff */ }else{ /* do stuff once more *}

我想要验证这个字符串中的 if 语法是否正确。例如,确保 else{} 语句不在 else if(){} 语句之前,或者括号没有打开等...我不关心括号内的代码。字符串可以有任意数量的“if else”语句,也可以有或没有“else”语句。

我已经编写了一个函数来检查它,但如果有这样的库或脚本,我更喜欢使用它。

【问题讨论】:

  • 这似乎有点不同,因为它试图检查单个语句,而不是编译完整的类?
  • 完全正确。我正在尝试在我自己制作的一小段孤立的伪代码中验证语法。

标签: java parsing syntax-error


【解决方案1】:

您可以尝试使用http://www.antlr.org/ 构建自己的解析器。

如果您不关心括号内的代码,那么这可能是矫枉过正。

【讨论】:

    【解决方案2】:

    您可以使用Java Scripting API。有几个脚本引擎,适用于 JavaScript,也适用于 BeanShell,一种简化的 Java,正好适合这种零碎的代码。

    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("BeanShell");
    try {
        engine.eval("int if = -1;");
    } catch (ScriptException e) {
        grrrr(e);
    }
    

    【讨论】:

    • 我正在尝试您的方式,我导入了 ScriptEngineManager 库,但是当您的代码 sn-p 运行时,它在 engine = factory.getEngineByName("BeanShell"); 处引发空异常;能否请您告诉我如何将 BeanShell 导入 ScriptEngineManager?
    • BeanShell 是一个历史悠久的脚本引擎。我已经很多年没有看它了。它与其他语言一起列出here。 BeanShell 本身有很好的文档并提到嵌入。您必须为我看到的 BeanShell 注册工厂 - 抱歉。恐怕 BeanShell 脚本可能是二级项目。
    【解决方案3】:

    如果您只想检查语法,可以使用一些现有的 Java 代码解析器,例如 JavaParser

    例子:

        final String classText = text + "\n" + "public class Dummy{}";
        final StringReader reader = new StringReader(classText);
        final CompilationUnit compilationUnit = JavaParser.parse(reader, true);
    

    【讨论】:

      【解决方案4】:

      虽然构建自己的解析器是最完整的解决方案,正如 Gregor 所写,但可以使用正则表达式执行有限的语法检查。

      【讨论】:

        猜你喜欢
        • 2020-11-11
        • 2015-05-18
        • 2013-06-22
        • 1970-01-01
        • 2011-04-21
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多