3

我刚刚开始使用 antlr3 并试图序列化 .g 语法的 AST 输出。
谢谢,
乐赞

4

2 回答 2

2

Parser 生成的 CommonTree 节点不可序列化。

我建议您序列化令牌并使用辅助语法稍后解析令牌的(反序列化)流。在本书(The Definitive ANTLR Reference)中,在“不耐烦的快速浏览”一章中,Terence Parr 准确地给出了这种情况——虽然没有序列化,但序列化对于标记来说是微不足道的,因为它们只是文本。

我的理解也是,您可以用自己的替换 Tree 类:

options {
  ASTLabelType = MyOwnTreeClass;
}

但我还没有尝试过。

于 2009-11-19T14:48:43.863 回答
2

正如 Vladimir 指出的那样,您可以使用内置序列化功能的自定义 AST 节点类。您还可以使用树适配器来创建所需的节点类型。

如果您只需要序列化,而不需要反序列化,您可能只需要这样做:

ast.toStringTree()

以上将为您提供类似树形结构的 LISP。进行序列化的一种简单方法是将其与具有覆盖的自定义 AST 节点类结合使用toString()。由于toStringTree()使用节点的toStringTree方法,它本质上会序列化你放入的任何内容toString。使其输出充分且有用,您应该做好准备。

于 2009-12-03T17:15:44.600 回答