从AST获取方法时的错误声明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从AST获取方法时的错误声明相关的知识,希望对你有一定的参考价值。

我正在尝试使用AST获取方法的声明,因此可以遍历它,查找某些语句。它以前曾经工作过,但是我不能再继续工作了,我得到的宣言对我来说就像是某种解析错误。我找不到有关如何解决此问题的信息:

<|java+method:///MetricsTest/testMethod()|,compilationUnit([],[],src=|java+method:///MetricsTest/testMethod()|(0,30,<1,0>,<2,2>),decl=|java+compilationUnit:///MetricsTest/testMethod()|,messages=[error("Syntax error on token \"void\", @ expected",|java+method:///MetricsTest/testMethod()|(7,4,<1,0>,<1,0>)),error("Syntax error, insert \"enum Identifier\" to complete EnumHeader",|java+method:///MetricsTest/testMethod()|(23,1,<1,0>,<1,0>))])>

我的(部分)代码如下:

public rel[loc, loc] getMethods(M3 model) 
    return  <x,y> | <x,y> <- model.containment
               , x.scheme=="java+class"
               , y.scheme=="java+method" || y.scheme=="java+constructor" 
               ;


public rel[loc, Declaration] getMethodLocWithDeclaration(M3 model) 
    rel[loc, loc] methods = getMethods(model);
    rel[loc, Declaration] methodsWithAST = ;
    for(<loc c, loc m> <- methods) 
        methodsWithAST += <m, createAstFromFile(m, false)>;
    

    return methodsWithAST;

有人知道我该如何解决吗?

答案

createAstFromFile函数将返回AST的“一半”,即使输入文件中存在解析错误。因此,您获得了一个compilationUnit节点,但是在它的正下方有一个error节点,其中包含有关解析错误的信息。

另一答案

我最终要做的是为每个文件创建一个AST,访问该AST,每当我发现构造函数或方法时,都将impl添加到列表中。对于此列表,我发现我可以使用src来找到实际的loc

以上是关于从AST获取方法时的错误声明的主要内容,如果未能解决你的问题,请参考以下文章

Groovy编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 )

在 main 方法中声明与在 main 方法之外声明时的其他结果

ast生成时的antlr 4.7错误

在XML中将属性类型声明为实体时的验证错误

在 Delphi XE2 中使用泛型和前向声明时的编译器错误

“编译为”设置为“默认”时的外部符号链接错误[重复]