Каковы общие стратегии сокращения дерева синтаксического анализа (т. Е. Конкретного дерева синтаксиса) в абстрактное синтаксическое дерево?Как уменьшить дерево синтаксического анализа в абстрактное синтаксическое дерево?
К примеру, у меня есть следующие правила грамматики:
statement_list : statement
| statement_list statement
, который, если оставить в качестве дерева разбора, будет генерировать раздувают вывод, который выглядит как
program
statement_list
statement_list
statement
definition
p_type
assignment
statement
definition
statement
assign
assignment
Если я конкатенации детей каждый узел (поскольку список операторов не имеет неотъемлемого значения после разбора), я могу достичь следующих результатов:
program
definition
p_type
assignment
definition
assign
assignment
Это сработало хорошо - однако я не знаю никаких «правил» для этого. Существуют ли конкретные правила грамматики, которые я должен упростить? Это вопрос, или есть более механистический процесс?
Вы можете пойти на мягкий «внешний вид», но это в основном большая работа. Вы можете сделать это по существу механически, удалив узлы, которые вы можете восстановить, используя грамматику. См. Http://stackoverflow.com/a/1916687/120163 –