1

有没有办法找到代码块结束的行号

示例:对于以下输入

21) synchronized(Lock.class){
22)      a.getAndIncrement(); //some code
23)       
24) }

对应的 AST 是

             synchronized
                 PARENTESIZED_EXPR
                    EXPR
                       .
                          Lock
                          class
                 BLOCK_SCOPE
                    EXPR
                       METHOD_CALL
                          .
                             g
                             getAndIncrement
                          ARGUMENT_LIST

对于给定 CommonTree 的上述代码,是否有任何方法可以检索“同步”块结束的行号。上述代码的输出应为 24(因为同步块在第 24 行结束)。

4

1 回答 1

1

是的,通过以下技术:

  1. 确保}不会从 AST 中省略 。
    • 如果您使用重写运算符->,这意味着}令牌需要出现在右侧。
    • 如果您使用 AST 运算符^!,这意味着您不能在令牌!上使用运算}符。
  2. 找到tokenCommonTree对应的},调用getLine()token获取行号。

编辑:block这是语法中的当前规则:

block
    :   LCURLY blockStatement* RCURLY
        ->  ^(BLOCK_SCOPE[$LCURLY, "BLOCK_SCOPE"] blockStatement*)
    ;

如您所见,重写规则不包括RCURLY令牌,因此省略了有关块末尾位置的信息。可以修改规则以包含令牌:

block
    :   LCURLY blockStatement* RCURLY
        ->  ^(BLOCK_SCOPE[$LCURLY, "BLOCK_SCOPE"] blockStatement* RCURLY)
    ;

请注意,这也需要更新树语法中的相应内容。

block
    :   ^(BLOCK_SCOPE blockStatement* RCURLY)
    ;
于 2013-08-19T21:59:40.737 回答