A13. Грамматика
Ниже приведены грамматические правила, которые мы уже рассматривали в данном приложении. Они имеют то же содержание, но даны в ином порядке.
Здесь не приводятся определения следующих символов-терминов: целая-константа, символьная-константа, константа-с-плавающей-точкой, идентификатор, строка и константа-перечисление. Слова, набранные обычным латинским шрифтом (не курсивом), и знаки рассматриваются как символы-термины и используются точно в том виде, как записаны. Данную грамматику можно механически трансформировать в текст, понятный системе автоматической генерации грамматического распознавателя. Для этого помимо добавления некоторых синтаксических пометок, предназначенных для указания альтернативных продукций, потребуется расшифровка конструкции со словами "один из" и дублирование каждой продукции, использующей символ с индексом необ., причем один вариант продукции должен быть написан с этим символом, а другой - без него. С одним изменением, а именно - удалением продукции typedef-имя:идентификатор и объявлением typedef-имени символом-термином, данная грамматика будет понятна генератору грамматического распознавателя YACC. Ей присуще лишь одно противоречие, вызываемое неоднозначностью конструкции if-else.
единица–трансляции: внешнее-объявление
единица-трансляции внешнее-объявление
внешнее-объявление: определение-функции
объявление
определение функции: спецификаторы-объявлениянеоб объявитель
список-объявленийнеоб составная-инструкция
объявление: спецификаторы-объявления список-инициализаторов-объявителейнеоб
список-объявлений: объявление
список-объявлений объявление
спецификаторы-объявления: спецификатор-класса-памяти спецификаторы-объявлениянеоб
спецификатор-типа спецификаторы-объявлениянеоб
квалификатор-типа спецификаторы-объявлениянеоб
спецификатор-класса-памяти: один из auto register static extern typedef
спецификатор-типа: один из void char short int long float double signed unsigned спецификатор-структуры-или-объединения
