ASTParser:在ExpressionStatement之前插入IfStatement

时间:2014-06-25 08:37:50

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

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

例如,我有一个ExpressionStatement节点:

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

visit(ExpressionStatement node)之后,节点将是:

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

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

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

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

请注意,您提供的代码不是表达式而是表达式,更详细地说是表达式语句。此外,虽然if是&#34;之前&#34;代码中的语句,它是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...
                ...