Как сериализовать antlr3 AST - PullRequest
       11

Как сериализовать antlr3 AST

3 голосов
/ 19 ноября 2009

Я только начал использовать antlr3 и пытаюсь сериализовать вывод AST грамматики .g.
Спасибо,
Lezan

Ответы [ 2 ]

2 голосов
/ 03 декабря 2009

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

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

ast.toStringTree()

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

2 голосов
/ 19 ноября 2009

Узлы CommonTree, созданные Parser, не являются Сериализуемыми.

Я бы предложил вам сериализовать токены и использовать вторичную грамматику для последующего анализа (десериализованного) потока токенов. В книге (The Definitive ANTLR Reference), в главе Quick Tour for Impatient, Теренс Парр приводит именно этот сценарий - хотя и без сериализации, но сериализация для токенов тривиальна, поскольку они являются просто текстом.

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

options {
  ASTLabelType = MyOwnTreeClass;
}

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

...