【发布时间】:2009-11-19 14:11:24
【问题描述】:
我刚刚开始使用 antlr3,正在尝试序列化 .g 语法的 AST 输出。
谢谢,
乐赞
【问题讨论】:
我刚刚开始使用 antlr3,正在尝试序列化 .g 语法的 AST 输出。
谢谢,
乐赞
【问题讨论】:
正如 Vladimir 指出的那样,您可以使用内置序列化功能的自定义 AST 节点类。您还可以使用树适配器来创建所需的节点类型。
如果你只需要序列化,而不需要反序列化,你可以这样做:
ast.toStringTree()
以上将为您提供类似树形结构的 LISP。进行序列化的一种简单方法是将其与具有覆盖 toString() 的自定义 AST 节点类结合使用。由于toStringTree() 使用节点的toStringTree 方法,它本质上会序列化您放入toString 的任何内容。使其输出充分且有用,您应该做好准备。
【讨论】:
Parser 生成的 CommonTree 节点不可序列化。
我建议您序列化 Tokens 并使用辅助语法稍后解析(反序列化的)Tokens 流。在这本书(The Definitive ANTLR Reference)的 Quick Tour for Impatient 一章中,Terence Parr 给出了这个场景——虽然没有序列化,但是序列化对于标记来说是微不足道的,因为它们只是文本。
我的理解也是你可以用你自己的替换 Tree 类:
options {
ASTLabelType = MyOwnTreeClass;
}
但我没试过。
【讨论】: