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