Обычно, когда бизон говорит это, он жалуется на грамматику, которой вы его кормите.Это сообщение об ошибке означает, что с этой грамматикой невозможно построить правильное предложение, состоящее только из терминальных символов.Ваша грамматика должна быть исправлена, чтобы иметь возможность строить синтаксические деревья , в листьях которых есть только терминальные символы .Если вы проверите это, вы обнаружите, что на самом деле невозможно построить дерево разбора, которое имеет только конечные символы в листьях.Попробуйте и посмотрите сами.Это происходит с этой простой грамматикой.
sentence: '*' sentence
| '(' sentence ')' ;
вы увидите, что все деревья синтаксического анализа, которые вы строите для sentence
, всегда имеют sentence
в качестве одного из своих листьев, поэтому невозможно построить правильное предложение втот язык, который имеет только терминальные символы.
Технические подробности вашей конкретной проблемы обсуждаются в другом ответе, поэтому я не буду повторять их здесь (Bison использует первое правило, которое вы пишете в грамматике, для использования в качестве rootсинтаксического дерева, по умолчанию, в вашем случае это declaration
, а не программа)
В любом случае, если вы получили эту ошибку, возможно, это не единственная проблема, с которой вы столкнулись.Если вы попробуете bison
с опциями --report
и --report-file
(см. Man-страницу), вы получите более подробную информацию о правиле, которое делает его неудачным.
edit
посмотрев на ваш код, вы расширяете declaration
как declaration
и больше вещей в во всех альтернативах, которые вы предоставляете для declaration
. Это никогда не может генерировать объявление только терминальных символов, поскольку при расширениивсегда есть declaration
для расширения.