ANTLR - 将完整匹配的文本放入AST

时间:2012-05-22 03:18:05

标签: java parsing antlr

我正在尝试让我的AST节点包含匹配规则的全文。试图

statement: 'blah' subrule ';' -> ^(MY_STATEMENT subrule $text);

不起作用。 我正在查看我回来的CommonTree的实例,它们确实包含startIndex和stopIndex字段,但它们似乎是令牌流的索引,我没有看到从中重新组合匹配文本的明确方法。这看起来很明显, 可以吗?

1 个答案:

答案 0 :(得分:1)

当然,你可以在一个虚构的标记之后加上方括号,将自定义文本放在(假想的)AST节点中:

tokens {
  TEXT;
}

rule
 : subrule1 subrule2 -> ^(TEXT["custom text here"] subrule1)
 ;

但是,您无法引用与重写规则中的$text 匹配的所有文本。在重写规则中,以$开头的所有内容都被视为规则的标签/变量:

rule
 : text=subrule1 other=subrule2 -> ^($text $other)
 ;

$text只能在解析器(或词法分析器)规则中使用,以获取匹配规则的所有文本:

rule
 : subrule1 subrule2 {System.out.println("I matched: " + $text);} -> ^(...)
 ;

要在重写规则中输入文本,请按以下步骤操作:

grammar T;

options { 
 output=AST; 
}

tokens { 
 MY_STATEMENT;
 TEXT;
}

statement
 : 'blah' subrule ';' -> ^(MY_STATEMENT subrule TEXT[$statement.text])
 ;

subrule
 : Digit Digit
 ;

Digit
 : '0'..'9'
 ;

将输入"blah78;"解析为以下AST:

enter image description here