ANTLR:给定CommonTree的代码块结尾的行号

时间:2013-08-19 13:27:54

标签: antlr3

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

示例:用于以下输入

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有任何方法可以检索“synchronized”块结束的行号。上述代码的输出应为24(因为同步块在第24行结束)。

1 个答案:

答案 0 :(得分:1)

是的,通过以下技术:

  1. 确保不会从AST中省略}
    • 如果您使用重写操作符->,则表示}令牌需要显示在右侧。
    • 如果您使用AST运算符^!,则表示您无法在!令牌上使用}运算符。
  2. 找到与CommonTree令牌对应的},并在令牌上调用getLine()以获取行号。
  3. 编辑:以下是语法中的当前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)
        ;