在我的 ANTLR 语法中,我有一条规则说查询可以是单个片段或与 PLUS 符号连接在一起的片段列表。我正在生成一个 AST 作为输出,我想做的是根据片段的数量重写节点。
如果有一个片段,则应该只有一个节点。如果有多个片段,我希望根节点为 PLUS,所有片段为子节点。这可能吗?
query
: frag (PLUS frag)* -> ^(PLUS frag*)
;
在我的 ANTLR 语法中,我有一条规则说查询可以是单个片段或与 PLUS 符号连接在一起的片段列表。我正在生成一个 AST 作为输出,我想做的是根据片段的数量重写节点。
如果有一个片段,则应该只有一个节点。如果有多个片段,我希望根节点为 PLUS,所有片段为子节点。这可能吗?
query
: frag (PLUS frag)* -> ^(PLUS frag*)
;
当然,您可以在重写规则中使用谓词,如下所示:
p
: M N? P? -> {boolean-expression-1}? ^(rewrite-rule-1)
-> {boolean-expression-2}? ^(rewrite-rule-2)
-> ^(rewrite-rule-3)
;
在您的情况下,只需检查PLUS
布尔表达式中是否存在令牌:
query
: frag (PLUS frag)* -> {$PLUS != null}? ^(PLUS frag+)
-> frag
;
frag
: ID
;
ID
: 'a'..'z'+
;
PLUS
: '+'
;
(注意这fragment
是 ANTLR 中的保留关键字)
输入 like"a"
将被解析如下:
并且"a+b+c+d"
作为:
我假设您不是在寻找二叉树,对吗?但是,如果您使用内联树运算符 ,^
将使这变得如此简单:
query
: frag (PLUS^ frag)*
;
为:创建以下 AST "a+b+c+d"
: