Я применил следующий патч к вашему коду, чтобы исправить пару предупреждений от Bison.В вашем правиле верхнего уровня отсутствовало действие для пустого регистра (и, следовательно, ему не удалось назначить $$
), а другое правило также не назначало ничего для $$
.Т.е. ваши file
правила не накапливают объекты в главном дереве, и поэтому ваша yyparse
функция не будет возвращать дерево:
Index: test/test.y
===================================================================
--- test.orig/test.y 2012-03-15 16:34:31.992021757 -0700
+++ test/test.y 2012-03-15 17:00:27.666596757 -0700
@@ -57,8 +57,9 @@
%%
-file :
- | object file { printtree($1, 1); }
+file : /* empty */ { return NULL; }
+ | object file { printtree($1, 1); return NULL; }
+ /* TODO: gather the objects into a tree and return */
;
object : field object {$$ = make_op($1, '', $2);}
| field {$$ = $1 ; }
Теперь у вас есть проблемы в грамматике.Основным является то, что ваши field
постановки не прекращаются.Они генерируют бесконечные предложения.Каждое из произведений для field
производит что-то, что заканчивается field
;Расширение грамматики не может быть завершено.
Основная проблема в том, что в вашей грамматике слишком много мест, где имеет место расширение, и над одним и тем же материалом.Ваш file
производит ноль или более object
.object
- это ноль больше экземпляров field
.И тогда поле также хочет сгенерировать больше field
.
Это означает, что ваш file
на самом деле является просто последовательностью field
.Последовательность нескольких field
-s уже обработана, и она должна обрабатываться только на одном уровне;поле не должно выдавать больше field
.