我试图让我的 AST 节点包含匹配规则的全文。试
statement: 'blah' subrule ';' -> ^(MY_STATEMENT subrule $text);
不起作用。我正在查看我返回的 CommonTree 实例,它们确实包含 startIndex 和 stopIndex 字段,但它们似乎是令牌流的索引,我看不到从中重新组装匹配文本的清晰方法。这似乎是一件很明显的事情,可以做到吗?
当然,您可以在虚构的标记之后放置方括号,以将自定义文本放入(虚构的)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: