【问题标题】:ANTLR: how to linearize/flatten a tree-structure?ANTLR:如何线性化/扁平化树结构?
【发布时间】:2014-04-01 16:05:15
【问题描述】:

我需要从以下结构转换文本:

{ A1 A2 { B1 B2 { C1 C2 } } }

到以下开发/扁平结构:

{ A1 }
{ A2 B1 }
{ A2 B2 C1 }
{ A2 B2 C2 }

我使用下面的 Antlr 语法来解析文件:

grammar tree;
node : '{' (STRING | node)* '}';
STRING : ('A' .. 'Z' | '0' .. '9')+;
WS : ( ' ' | '\t' | '\n' | '\r') -> channel(HIDDEN);

是否可以仅使用内联 Antlr 重写规则(使用 ->)来执行 Ast 转换?

【问题讨论】:

    标签: parsing antlr transformation lexer


    【解决方案1】:

    通过查看 channel(HIDDEN),您似乎正在使用 ANTLR4,它不再具有重写功能:ANTLR 4 tree inject/rewrite operator。此外,如果您使用的是 ANTLR3,我怀疑您是否能够以这种方式重写 AST。

    您应该将其视为两个操作:1) 解析输入,以及 2) 遍历/访问解析树并 [通过使用普通编程] 将解析树重写为其他内容。这最后一步由您自己在 ANTLR 为其生成基类的树侦听器或访问者中完成。

    【讨论】:

    • 谢谢。语法并不完全是我使用的语法,它只是给出复合模型的一个例子。我确实已经以与您描述的相同的方式实现了转换:用 C# 实现了一个访问者。我很想知道是否可以使用智能重写规则“开发”树......并且没有访问者......还有其他建议吗?
    • @jrg,正如我所说:ANTLR4 没有任何方法可以重写其(解析)树,只有 ANTLR3 可以。而对于 ANTLR3,我非常怀疑这是否可能:重写规则更多地是为了删除或对树中的节点进行小的改动,而不是像你描述的那样从根本上改变它。
    猜你喜欢
    • 2011-11-15
    • 2022-09-26
    • 1970-01-01
    • 2021-11-19
    • 2017-01-07
    • 2021-11-24
    • 2021-03-29
    • 2017-11-16
    • 2022-01-23
    相关资源
    最近更新 更多