ANTLR - 从AST中删除节点

时间:2014-04-24 11:29:56

标签: antlr nodes abstract-syntax-tree

我正在创建我的第一个AST。我想删除' ='从它。

我有类似的事情:

              BLOCK
                |
          |-----------|
     STATEMENTS     RETURN
          |
     ASSIGNMENT
          |
          |
    |-----|-----|
 field    =    value


An extract from my Grammar file:

parse
  :  block EOF -> block
  ;

block
  :  (statement)* (Return Identifier ';')? 
     -> ^(BLOCK ^(STATEMENTS statement*) ^(RETURN Identifier?))
  ;

statement
  :  assignment ';'   -> assignment
  ;

assignment
   :  expression 
   -> ^(ASSIGNMENT expression)
   ;

expression
    :   NAME '=' Identifier
    ;

那么,我怎样才能删除' ='在树中打印的节点?

1 个答案:

答案 0 :(得分:2)

使用内联运算符!来丢弃树中的节点:

expression
    :   NAME '='! Identifier
    ;

或使用重写运算符:

expression
    :   NAME '=' Identifier -> NAME Identifier
    ;

解释这些运算符的相关问答:How to output the AST built using ANTLR?

请注意,语法中没有ASSIGNMENT标记。如果要注入此类令牌,​​请将其放入tokens{ ... }块并将其插入重写规则中:

grammar T;

options {
  // ...
}

tokens {
  ASSIGNMENT;
}

statement
    :  assignment ';' -> assignment
    ;

expression
    :   NAME '=' Identifier -> ^(ASSIGNMENT NAME Identifier)
    ;