C++. Бархатный путь. Часть 1
Страница 21. Элементы программного модуля


Элементы программного модуля

Мы переходим к описанию синтаксиса элементов программного модуля, но, прежде всего, определим ещё одну категорию спецификаторов объявления.

СпецификаторОбъявления ::= fctСпецификатор
::= *****
fctСпецификатор ::= inline
::= virtual

fctСпецификатор используется при объявлении и определении функций. Их назначение ещё будет обсуждаться в дальнейшем.

ЭлементПрограммногоМодуля ::= СписокИнструкцийПрепроцессора
::= СписокОператоров
СписокОператоров ::= [СписокОператоров] Оператор
Оператор ::= ОператорОбъявления
::= *****
ОператорОбъявления ::= Объявление
Объявление ::= ОбъявлениеФункции
::= ОпределениеФункции
::= *****
ОбъявлениеФункции ::=
[СписокСпецификаторовОбъявления]
Описатель
[СпецификацияИсключения];
ОпределениеФункции ::=
[СписокСпецификаторовОбъявления]
Описатель
[ctorИнициализатор]
[СпецификацияИсключения]
ТелоФункции
Описатель ::= ИмяОписатель
::= ptrОперация Описатель
::= Описатель (СписокОбъявленийПараметров)
::= Описатель [[КонстантноеВыражение]]
::= (Описатель)
ИмяОписатель ::= Имя
::= *****
ptrОперация ::= * [СписокCVОписателей]
::= & [СписокCVОписателей]
СписокCVОписателей ::= CVОписатель [СписокCVОписателей]
CVОписатель ::= const | volatile
ctorИнициализатор ::= *****
СпецификацияИсключения ::= *****

О последних двух нетерминалах позже.

КонстантноеВыражение ::= УсловноеВыражение

Свойства константного выражения мы также обсудим позже.

УсловноеВыражение ::= *****
СписокОбъявленийПараметров ::= [СписокОбъявленийПарам] [...] ::= СписокОбъявленийПарам, ...

Следует обратить особое внимание на последнюю БНФ. В ней зафиксировано различие между двумя нетерминалами. Так что СписокОбъявленийПараметров - совсем не то, что СписокОбъявленийПарам. Здесь нет никаких опечаток или ошибок. Первый нетерминал по смыслу шире второго. Три точечки, заключённые в круглые скобочки (...) уже в определённом контексте можно рассматривать как СписокОбъявленийПараметров, но это никак не СписокОбъявленийПарам. Это как раз тот самый случай, когда к нетерминалам имеет смысл относится как к СИМВОЛАМ, а не как к последовательностям подчёркнутых слов.

СписокОбъявленийПарам ::= ОбъявлениеПараметра
::= [СписокОбъявленийПарам,] ОбъявлениеПараметра
ОбъявлениеПараметра ::=
СписокСпецификаторовОбъявления Описатель
::= СписокСпецификаторовОбъявления
Описатель
Инициализатор
::=
СписокСпецификаторовОбъявления
[АбстрактныйОписатель]
[Инициализатор]
АбстрактныйОписатель ::= ptrОперация [АбстрактныйОписатель]
::= [АбстрактныйОписатель]
(СписокОбъявленийПараметров)
[СписокCVОписателей]
::= [АбстрактныйОписатель] [[КонстантноеВыражение]]
::= (АбстрактныйОписатель)

БНФ, раскрывающая смысл нетерминала АбстрактныйОписатель, также проста, как и все прочие БНФ. Достаточно беглого взгляда, чтобы понять, что в роли этого самого абстрактного описателя могут выступать операции *, &, даже пара символов [], между которыми может располагаться константное выражение. Абстрактный описатель можно также поместить в круглые скобки.

Если обычный описатель предполагает какое-либо имя, то абстрактный описатель предназначается для обозначения неименованных (безымянных) сущностей.

ТелоФункции ::= СоставнойОператор
СоставнойОператор ::= {[СписокОператоров]}

Фигурные скобочки - характерный признак составного оператора.

СписокОператоров ::= Оператор
::= СписокОператоров Оператор
Оператор ::= ОператорОбъявления
::= *****
СписокИнструкцийПрепроцессора ::=
[СписокИнструкцийПрепроцессора]
ИнструкцияПрепроцессора
ИнструкцияПрепроцессора ::= #
::= Макроопределение
::= ФункциональноеМакроопределение
::= *****
Макроопределение ::= #define Идентификатор СтрокаЛексем
ФункциональноеМакроопределение ::=
#define Идентификатор (СписокИдентификаторов) СтрокаЛексем
СписокИдентификаторов ::= Идентификатор
::= СписокИдентификаторов, Идентификатор
СтрокаЛексем ::= Лексема
::= СтрокаЛексем Лексема

Составной оператор также называют блоком операторов (или просто блоком).

Несмотря на значительное количество пропусков в приведённых выше БНФ, содержащейся в них информации о синтаксисе программного модуля вполне достаточно для реконструкции его общей структуры. 

 
« Предыдущая статья   Следующая статья »