我正在尝试让我的AST节点包含匹配规则的全文。试图
statement: 'blah' subrule ';' -> ^(MY_STATEMENT subrule $text);
不起作用。 我正在查看我回来的CommonTree的实例,它们确实包含startIndex和stopIndex字段,但它们似乎是令牌流的索引,我没有看到从中重新组合匹配文本的明确方法。这看起来很明显, 可以吗?
答案 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: