- •0. Оглавление
- •1.2. Соглашения об обозначениях
- •2) Описания
- •1.5. Выражения
- •5) Аддитивные операторы
- •1) Оператор-выражение
- •2) Составной оператор
- •3) Условный оператор
- •Атрибутная грамматика
- •Семантические процедуры
- •2.2. Подграмматика описаний
- •Атрибутная грамматика
- •Семантические процедуры
- •2.3. Основная грамматика
- •Атрибутная грамматика
- •Семантические процедуры
- •Приложение 1. Таблицы лексем
- •Приложение 2. Описания триад
1) Оператор-выражение
оператор-выражение: [ выражение ] ;
Чаще всего выражение является выражением присваивания. Если выражение опущено, то оператор называется пустым оператором.
2) Составной оператор
составной_оператор: { [ список_описаний ] [ список_операторов ] }
список_описаний: описание { описание }
список_операторов: оператор { оператор }
Составной оператор также называют блоком. Все идентификаторы, описанные в объемлющих блоках, видимы внутри блока. Идентификаторы, описанные внутри блока, после выхода из него становятся видны в объемлющих блоках. Инициализация объектов происходит при каждом входе в блок и продолжается по мере продвижения по описателям. При передаче управления внутрь блока инициализации не выполняются.
3) Условный оператор
уловный_оператор: if ( выражение ) оператор [ else оператор ]
Если выражение даёт ненулевое значение, выполняется первый оператор, в противном случае – второй. Если ключевое слово elseопущено, никаких действий не производится. Если первый оператор в свою очередь является условным оператором, может возникнуть подобная ситуация:
if(expr1)if(expr2) op1elseop2
В таких случаях else относят к последнему if, не имеющему else и находящемуся в одном с этим else блоке. В примере – к if(expr2).
4) Оператор цикла
оператор_цикла: while ( выражение ) оператор
Оператор выполняется, пока значение выражения не станет нулём. Вычисление выражения производится перед каждым выполнением оператора.
5) Оператор перехода
оператор_перехода: goto метка ; return выражение ;
В результате выполнения goto управление передаётся на помеченный оператор. Оператор return прекращает выполнение программы и передаёт системе код возврата.
6) Операторы ввода и вывода
оператор_ввода: input ( постфиксное_выражение )
Оператор ввода требует l-value. Из входного потока читается значение, которое помещается в обозначенный объект. Если тип объекта – вектор, то читаются вещественные числа в количестве, равном размерности вектора.
оператор_вывода: output ( выражение ) output ( строковая_константа )
В выходной поток помещается значение выражения или содержимое строковой константы. Если тип выражения – вектор, выводятся все компоненты.
1.7. Программа
программа: int main() составной_оператор
2. Синтаксический анализатор
Синтаксический анализатор распознаёт текст, состоящий из терминальных символов, множеством которых служит множеством лексем, выдаваемых лексическим анализатором.
Разобьём множество правил входной LL(1) грамматики на три подграмматики:
подграмматика выражений;
подграмматика описаний;
основная грамматика
2.1. Подграмматика выражений
E |
выражение присваивания |
EE |
остаток выражения присваивания |
D |
ИЛИ-выражение (дизъюнкт) |
D' |
остаток ИЛИ-выраженя |
K |
И-выражение (конъюнкт) |
K' |
остаток И-выражения |
RL |
выражение отношения |
RL' |
остаток выражения отношения |
AD |
аддитивное выражение |
AD' |
остаток аддитивного выражения |
ML |
мультипликативное выражение |
ML' |
остаток мультипликативного выражения |
UN |
унарное выражение |
EP |
постфиксное выражение |
EPP |
остаток постфиксного выражения |
E1 |
первичное выражение |
E EP EE
EE = D EE
EE =
D K D'
D' || K D'
D'
K RL K'
K' && RL K'
K'
RL AD RL'
RL' < AD RL'
RL' > AD RL'
RL' <= AD RL'
RL' >= AD RL'
RL' == AD RL'
RL' != AD RL'
RL'
AD ML AD'
AD' + ML AD'
AD' - ML AD'
AD'
ML UN ML'
ML' * UN ML'
ML' / UN ML'
ML'
UN EP
UN len ( vi )
UN + UN
UN - UN
UN ! UN
EP E1 EPP
EPP [ E ] EPP
EPP
E1 idv
E1 ivc
E1 con
E1 ( E )
ivc – идентификатор вектора
idv – идентификатор переменной
con – константа