Страница 21 из 82
Элементы программного модуля Мы переходим к описанию синтаксиса элементов программного модуля, но, прежде всего, определим ещё одну категорию спецификаторов объявления. СпецификаторОбъявления ::= fctСпецификатор ::= ***** fctСпецификатор ::= inline ::= virtual
fctСпецификатор используется при объявлении и определении функций. Их назначение ещё будет обсуждаться в дальнейшем. ЭлементПрограммногоМодуля ::= СписокИнструкцийПрепроцессора ::= СписокОператоров СписокОператоров ::= [СписокОператоров] Оператор Оператор ::= ОператорОбъявления ::= ***** ОператорОбъявления ::= Объявление Объявление ::= ОбъявлениеФункции ::= ОпределениеФункции ::= ***** ОбъявлениеФункции ::= [СписокСпецификаторовОбъявления] Описатель [СпецификацияИсключения]; ОпределениеФункции ::= [СписокСпецификаторовОбъявления] Описатель [ctorИнициализатор] [СпецификацияИсключения] ТелоФункции Описатель ::= ИмяОписатель ::= ptrОперация Описатель ::= Описатель (СписокОбъявленийПараметров) ::= Описатель [[КонстантноеВыражение]] ::= (Описатель) ИмяОписатель ::= Имя ::= ***** ptrОперация ::= * [СписокCVОписателей] ::= & [СписокCVОписателей] СписокCVОписателей ::= CVОписатель [СписокCVОписателей] CVОписатель ::= const | volatile ctorИнициализатор ::= ***** СпецификацияИсключения ::= *****
О последних двух нетерминалах позже. КонстантноеВыражение ::= УсловноеВыражение Свойства константного выражения мы также обсудим позже. УсловноеВыражение ::= ***** СписокОбъявленийПараметров ::= [СписокОбъявленийПарам] [...] ::= СписокОбъявленийПарам, ... Следует обратить особое внимание на последнюю БНФ. В ней зафиксировано различие между двумя нетерминалами. Так что СписокОбъявленийПараметров - совсем не то, что СписокОбъявленийПарам. Здесь нет никаких опечаток или ошибок. Первый нетерминал по смыслу шире второго. Три точечки, заключённые в круглые скобочки (...) уже в определённом контексте можно рассматривать как СписокОбъявленийПараметров, но это никак не СписокОбъявленийПарам. Это как раз тот самый случай, когда к нетерминалам имеет смысл относится как к СИМВОЛАМ, а не как к последовательностям подчёркнутых слов. СписокОбъявленийПарам ::= ОбъявлениеПараметра ::= [СписокОбъявленийПарам,] ОбъявлениеПараметра ОбъявлениеПараметра ::= СписокСпецификаторовОбъявления Описатель ::= СписокСпецификаторовОбъявления Описатель Инициализатор ::= СписокСпецификаторовОбъявления [АбстрактныйОписатель] [Инициализатор] АбстрактныйОписатель ::= ptrОперация [АбстрактныйОписатель] ::= [АбстрактныйОписатель] (СписокОбъявленийПараметров) [СписокCVОписателей] ::= [АбстрактныйОписатель] [[КонстантноеВыражение]] ::= (АбстрактныйОписатель)
БНФ, раскрывающая смысл нетерминала АбстрактныйОписатель, также проста, как и все прочие БНФ. Достаточно беглого взгляда, чтобы понять, что в роли этого самого абстрактного описателя могут выступать операции *, &, даже пара символов [], между которыми может располагаться константное выражение. Абстрактный описатель можно также поместить в круглые скобки. Если обычный описатель предполагает какое-либо имя, то абстрактный описатель предназначается для обозначения неименованных (безымянных) сущностей. ТелоФункции ::= СоставнойОператор СоставнойОператор ::= {[СписокОператоров]}
Фигурные скобочки - характерный признак составного оператора. СписокОператоров ::= Оператор ::= СписокОператоров Оператор Оператор ::= ОператорОбъявления ::= ***** СписокИнструкцийПрепроцессора ::= [СписокИнструкцийПрепроцессора] ИнструкцияПрепроцессора ИнструкцияПрепроцессора ::= # ::= Макроопределение ::= ФункциональноеМакроопределение ::= ***** Макроопределение ::= #define Идентификатор СтрокаЛексем ФункциональноеМакроопределение ::= #define Идентификатор (СписокИдентификаторов) СтрокаЛексем СписокИдентификаторов ::= Идентификатор ::= СписокИдентификаторов, Идентификатор СтрокаЛексем ::= Лексема ::= СтрокаЛексем Лексема
Составной оператор также называют блоком операторов (или просто блоком). Несмотря на значительное количество пропусков в приведённых выше БНФ, содержащейся в них информации о синтаксисе программного модуля вполне достаточно для реконструкции его общей структуры. |