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