2

在我的 ANTLR 语法中,我有一条规则说查询可以是单个片段或与 PLUS 符号连接在一起的片段列表。我正在生成一个 AST 作为输出,我想做的是根据片段的数量重写节点。

如果有一个片段,则应该只有一个节点。如果有多个片段,我希望根节点为 PLUS,所有片段为子节点。这可能吗?

query
    : frag (PLUS frag)*  -> ^(PLUS frag*)
    ;
4

1 回答 1

2

当然,您可以在重写规则中使用谓词,如下所示:

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"

在此处输入图像描述

于 2012-06-06T20:10:15.150 回答