- •Комитет образования рф
- •Отчёт по курсовой работе
- •Языки программирования и методы трансляции
- •1. Описание входного языка.
- •1.2. Формализм для описания синтаксиса.
- •1.3.4. Идентификаторы.
- •1.3.5. Константы.
- •1.4.2. Выражения.
- •1.4.3. Описания.
- •Приложение 1. Полный синтаксис языка в форме Бэкуса-Наура.
- •2. Описание лексического анализатора.
- •2.1. Классы литер.
- •2.2. Классы лексем.
- •2. Описание синтаксического анализатора.
- •3.1. Входная грамматика анализатора.
- •Множество правил входной грамматики анализатора.
- •Атрибутная грамматика.
- •Семантические процедуры для операционных символов.
- •2) Атрибутная грамматика для подграмматики описаний.
- •Атрибутная грамматика.
- •Семантические процедуры для операционных символов.
- •Основная грамматика
- •Атрибутная грамматика.
- •Семантические процедуры для операционных символов.
1.3.4. Идентификаторы.
Идентификаторы используются в качестве имен для обозначения переменных, имен констант и меток.
Синтаксис :
<идентификатор>::=<буква> {<буква>|<цифра>}
<буква>::='_'|'a'|'b'|'c'|'d'|'e'|'f'|'g'|'h'|'i'|'j'|'k'|'l'|'m'|'n'|'o'|'p'|'q'|'r'|'s'|'t'|'u'|'v'|'w'|'x'|'y'|'z'|
|'A'|'B'|'C'|'D'|'E'|'F'|'G'|'H'|'I'|'J'|'K'|'L'|'M'|'N'|'O'|'P'|'Q'|'R'|'S'|'T'|'U'|'V'|'W'|'X'|'Y'|'Z'
<цифра>::='0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9'
Строчные и заглавные буквы различаются. Ограничение на длину: длина идентификатора не может быть больше 30 символов.
1.3.5. Константы.
Константы подразделяются на целые и вещественые. Значение константы определяется единожды и не может изменяться.
<константа>::=<константа_без_знака>
<знак>::='+'|'-'
<константа_без_знака>::=<имя_константы>|<число_без_знака>
<имя_константы>::=<идентификатор>
<число_без_знака>::=<целое_без_знака>['.'<целое_без_знака>]['E'<знак>
<целое_без_знака>]
<целое_без_знака>::=<цифра>{<цифра>}
1.3.6. Ключевые слова.
Следующие ключевые слова считаются зарезервированными и не могут использоваться в качестве идентификаторов:
int float void main goto length for if else scanf printf vector const
Ключевые слова воспринимаются как единые символы с фиксированным смыслом, который задан в определении языка.
1.3.7. Строки.
Строками считаются последовательность любых символов, заключенных в
"кавычки" .
1.4. Описания и типы.
1.4.1. Целый тип.
Целочисленный знаковый тип int : размер 2 байта, диапазон -32768..32767.
Вещественный тип float : размер 4 байта, диапазон +-3.4*10**(+-38)
Тип вектора vector с вещественными компонентами: максимальное число компонент 16383.
Операции:
Оператор |
тип оператора |
допустимые типы параметров |
+ |
унарный |
int, float, vector |
- |
унарный |
int, float, vector |
+ |
бинарный |
int, float, vector |
- |
бинарный |
int, float, vector |
* |
бинарный |
int, float, vector |
/ |
бинарный |
int, float |
[ ] |
унарный |
vector |
Length |
унарный |
vector |
&& |
бинарный |
int |
|| |
бинарный |
int |
==, !=, <, >, <=, >= |
бинарные |
int, float |
! |
унарный |
int |
1.4.2. Выражения.
Арифметические выражения.
<арифметическое_выражение>::=[<знак>]<терм>|<арифметическое_
выражение><знак><терм>
<терм>::=<множитель>|<терм><*_или_/><множитель>
<*_или_/>::='*'|'/'
<множитель>::='('<арифметическое_выражение> )'|<константа>|<оператор_длина_вектора>|<переменная>
<знак>::='+'|'-'
<оператор_длина_вектора>::='length('<арифметическое_выражение>')'
<оператор_элемента_вектора>::=<идентификатор>'['
<константа_без_знака>']'
Логические выражения.
<условное_выражение>::=<условное_выражение>'||'<конъюнкция>|
<конъюнкция>
<конъюнкция>::=<конъюнкция>'&&'<выражение>|<выражение>
<выражение>::='!'<выражение>|'('<условное_выражение>')'|<выражение>
<логическая_операция><условное_выражение>|<условное_выражение>
<логическая_операция>::='>'|'<'|'=='|'!='|'>='|'<='
1.4.3. Описания.
Любое описание сопоставляет с описываемым понятием некоторый идентификатор - имя переменной.
1.5. Операторы.
1.5.1. Пустой оператор.
Синтаксис :
<пустой_оператор> ::= ;
Пустой оператор не производит никаких действий, однако он необходим в некоторых языковых конструкциях (например, для реализации бесконечного цикла).
1.5.2. Оператор присваивания.
Синтаксис :
<переменная>::=<идентификатор>|<оператор_элемента_вектора>
<оператор_присваивания>::=<переменная>{'='<переменная>}
'='<арифметическое_выражение>';'
Порядок выполнения оператора присваивания :
Вычисляется значение выражения в правой части, затем, справа налево, оно присваивается переменным в левой части, если тип значения и переменной совпадают. В противном случае присваивание не выполняется и пользователю выдается сообщение об ошибке.
1.5.3. Оператор перехода.
Синтаксис :
<оператор_безусловного_перехода>::='goto' <метка>';'
Оператор осуществляет безусловный переход к оператору, помеченому меткой. При отсутствии такового выдается сообщение об ошибке. Метка должна быть уникальной в пределах программы.
1.5.4. Оператор вывода.
Синтаксис :
<оператор_вывода>::='printf('<сообщение>| {','<сообщение>} ');'
<сообщение>::={<строка>|<арифметическое_выражение>}
<строка>::=' " '{<символ>}' " '
<символ>::=<любой_символ>
Оператор осуществляет вывод в стандартный поток вывода, связаный обычно с экраном дисплея, значения переменной <переменная>.
1.5.5. Оператор ввода.
Синтаксис :
<оператор_ввода>::='scanf(' <идентификатор> {','<идентификатор>} ');'
Оператор ввода осуществляет чтение из стандартного потока ввода (клавиатуры) значения.
1.5.6. Составной оператор.
Синтаксис :
<составной_оператор> ::= '{' {<оператор>} '}'
Операторы, входящие в состав составного оператора, выполняются в порядке их написания.
1.5.7. Условный оператор.
Синтаксис :
<условный_оператор>::='if('<условное_выражение>')'<оператор>
['else'<оператор>]
Вначале вычисляется <условное_выражение>. Если оно истинно, то выполняется первый <оператор> иначе второй оператор, если он присутствует.
1.5.8. Оператор цикла for.
Синтаксис :
<оператор_цикла>::='for(' [<оператор_присваивания> {','<оператор_присваивания>} ] ';' [<условное_выражение> {',<условное_выражение>' } ] ';' [<оператор_присваивания> {','<оператор_присваивания>} ] ')' <оператор>';'
Выполняется оператор <оператор>, пока истинны все условные выражения.
1.6. Программа.
Синтаксис :
<программа>::=[<глобальное_описание>] 'void main(){'[<локальное_описание>] <оператор> '}'
Полный синтаксис языка в модифицированной форме Бэкуса-Наура приведен в приложении 1.
Пример программы на входном языке приведен ниже.
/*глобальные описания*/
int i=10+15/2, j;
float f, f1=12+14.5e-2;
vector V[10], Vec[5]={1, 2, 3};
void main()
{
/*локальные описания*/
int key,flag=0;
float r;
label:
scanf(key,V[0]);
for (j=0;j<i;j=j+1) ;
if ( (!(j>=7)) && ((i==8)||(!j)) )
{
printf("i=",15*i);
flag=1;/* изменение флага*/
}
if (a===0) goto label;
if (flag) printf("Ok");
}