【问题标题】:Check the modifier in the Rascal Java m3 AST检查 Rascal Java m3 AST 中的修饰符
【发布时间】:2014-05-13 14:42:35
【问题描述】:

Rascal m3 Java 抽象语法树中是否存在修饰符节点?我想检查某个方法是公共的、私有的还是受保护的。

In the description,声明了一个抽象数据类型,但是在我尝试访问的任何文件中,都没有找到匹配项。

在其他 ADT 中也没有指向修饰符的链接。在我尝试查找任何修饰符的代码下方。

public void visitModifier(loc file){ Declaration decl = createAstFromFile(file, true); visit(decl){ case \private(): println("private"); case \public(): println("public"); case \protected(): println("protected"); } }

【问题讨论】:

    标签: abstract-syntax-tree rascal


    【解决方案1】:

    很好的问题。在当前版本中,修饰符存储为声明上的注释。 visit 语句默认不访问注解,所以需要自己投影出来:

    void visitModifier(loc file){
      Declaration decl = createAstFromFile(file, true);
      visit (decl){
        case Declaration d: 
           switch (d@modifiers?[]) { // get out the modifiers or generate empty list 
              case [*_,\public(),*_]   : println("public");
              case [*_,\private(),*_]  : println("private");
              case [*_,\protected(),*_]: println("protected");
              default                  : println("friendly");
            }
      }
    }
    

    请注意,d@modifiers 会生成一个修饰符列表,因此您也可以在其中找到 \static()\final()。没有列表匹配当然也可以:

    void visitModifier2(loc file){
      Declaration decl = createAstFromFile(file, true);
      visit (decl){
        case Declaration d: {
           mods = d@modifiers?[];
           if (\public() <- mods) // or if (\public() in mods)
             println("public");
           else if (\private() <- mods)
             println("private");
           else if (\protected() <- mods)
             println("protected");
           else
             println("friendly");
        }
      }
    }
    

    或者,您可以像这样将所有修饰符收集在一个列表中:

    [ *(d@modifiers?[]) | /Declaration d := decl ]
    

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多