2009-11-19 2 views

ответ

2

Как указал Владимир, вы можете использовать собственный класс узлов AST, который имеет встроенные возможности сериализации. Вы также можете использовать адаптер дерева для создания нужных вам типов узлов.

Если вам нужно только сериализации, а не де-сериализации, вы могли бы, вероятно, просто сделать:

ast.toStringTree() 

выше даст вам LISP как древовидную структуру. Простым способом сериализации будет использование этого в сочетании с пользовательским классом AST с переопределенным toString(). Поскольку toStringTree() использует метод узла toStringTree, он по существу сериализует все, что вы ставите в toString. Сделайте свой вывод достаточным и полезным, и вы должны быть установлены.

2

CommonTree узлы, произведенные Parser не Сериализуемый.

Я предлагаю вам сериализовать токены и использовать вторичную грамматику для разбора (десериализованного) потока токенов позже. В книге (Окончательный ANTLR Reference) в главе «Быстрый тур для нетерпимости» Теренс Парр дает именно этот сценарий - без сериализации, но сериализация тривиальна для токенов, поскольку они всего лишь текст.

Мое понимание также, что вы можете заменить класс Tree с вашим собственным:

options { 
    ASTLabelType = MyOwnTreeClass; 
} 

Но я не пробовал.

Смежные вопросы