java - AST解析器: insert IfStatement before ExpressionStatement

标签 java if-statement expression abstract-syntax-tree

我正在尝试找出如何在单个 ExpressionStatement 之前插入 IfStatement。

例如,我有一个 ExpressionStatement 节点:

System.out.println("Hello World!");

访问(ExpressionStatement 节点)之后,该节点将是:

if ( 1 < 2)
   System.out.println("Hello World!");

我在 Java 中使用 ASTParser 来执行此操作。

如何解决这个问题?

最佳答案

我不知道这是什么类型的 AST 解析器,但从你模糊的描述来看,我猜你正试图在你的表达式语句周围包裹一个 if

请注意,您提供的代码不是表达式,而是语句,更详细地说是表达式语句。另外,虽然 if 位于代码中的语句“之前”,但它在 AST 中是其父语句,因为它与将大括号括在表达式语句周围完全相同。

要将 if 包裹在语句周围,您必须:

  • 获取语句节点的父节点
  • 从其父节点中删除语句节点
  • 创建一个新的if节点
  • if节点它的条件
  • 语句节点设置为if节点的语句
  • 表达式节点所在的位置添加if节点

所以在操作之前 AST 是:

// Code:
System.out.println("Hello World!");

// AST:
<Some node>
    ExpressionStatement                    // expression + ';'
        Expression                         // System.out...
            ...

操作后是:

// Code:
if(someCondition) System.out.println("Hello World!");

// AST:
<Some node>
    IfStatement                            // if(condition) statement
        Expression (Condition)             // someCondition
        ExpressionStatement (Statement)    // expression + ';'
            Expression                     // System.out...
                ...

关于java - AST解析器: insert IfStatement before ExpressionStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24403892/

相关文章:

c++ - while循环if和else

c++ - 编译器会把这个表达式优化成一个临时常量而不是每次迭代都解析它吗?

javascript - polymer 绑定(bind)条件属性和评估属性

c++ - x&&y||z 是如何计算的?

java - 即使 jar 文件在工作目录中也找不到类

javafx 2.1 组合框

java - 如何将相同的方法添加到多个类( Activity )

java - @RequestBody 中的日期问题

python - 使用条件导入作为在同一命名空间中使用不同函数的一种方式

JAVA .equalsIgnoreCase 不工作