1

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

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

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

4

1 回答 1

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:

在此处输入图像描述

于 2012-05-22T07:16:33.763 回答