【问题标题】:Antlr: can I rewrite tree differently if repeating a list or notAntlr:如果重复列表,我可以用不同的方式重写树吗
【发布时间】:2012-06-06 19:53:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: parsing antlr expression-trees antlr3 abstract-syntax-tree


    【解决方案1】:

    当然,您可以像这样在重写规则中使用谓词:

    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中的保留关键字)

    "a" 这样的输入将被解析如下:

    "a+b+c+d" 为:

    我假设您不是在寻找二叉树,对吧?但是,如果您使用内联树运算符 ^,则可以像这样简单:

    query
     : frag (PLUS^ frag)*
     ;
    

    "a+b+c+d" 创建以下 AST:

    【讨论】:

    • 谢谢@Bart!我不知道你可以像这样结合谓词和重写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多