- •Теория языков программирования и методы трасляции
- •1. Цель работы
- •2. Основные понятия и термины
- •3. Описание и ввод грамматики
- •Проверка и трансляция набранной грамматики
- •Проверка синтаксиса грамматики
- •Трансляция грамматики и запуск sag
- •Разбор цепочек по созданной грамматике
- •Задания
- •Подготовка к лабораторной работе
- •Порядок выполнения работы
- •Содержание отчета
- •Защита лабораторной работы
- •Контрольные вопросы
Задания
1. Расширить заданную грамматику, задающую математическое выражение со скобками и операциями "+", "-", "*", "/" до атрибутной, подсчитывающей значение выражения.
Правила исходной грамматики:
exp = mulDiv '+' exp;
exp = mulDiv '-' exp;
exp = mulDiv;
mulDiv = groupOrNumber '*' mulDiv;
mulDiv = groupOrNumber '/' mulDiv;
mulDiv = groupOrNumber;
groupOrNumber = '(' exp ')';
groupOrNumber = _TEXT;
2. Написать атрибутную грамматику, описывающую объявление переменных как в языке Си. Для каждой переменной сохранить её значение в атрибуте.
Так, если есть цепочка
int a = 10;
char *b = “abc”;
То при распознавании в дереве разбора должны встретиться два узла, например, следующего вида:
VAR_DEF [ name=”a”; val = “10” ]
VAR_DEF [ name=”b”; val = “abc” ]
3. Усовершенствовать сделанную в п.2 грамматику так, чтобы стартовый символ содержал атрибут, в котором был бы сохранён список названий всех переменных.
Т.е. если есть цепочка
int a, b;
char *c, *s;
То корень дерева должен содержать атрибут
[ vars=”a b c s” ].
4. Усовершенствовать сделанную в п.3 грамматику так, чтобы можно было задавать значения по-умолчанию для переменных. Т.е. в случаях, когда значение явным образом не присвоено – задавать его равным некой константе (которая должна задаваться через наследуемый атрибут для стартового символа грамматики).
Так, если есть цепочка
char *s;
float f;
То при распознавании в дереве разбора должны встретиться узлы, например, следующего вида:
VAR_DEF [ name=”s”; val = “NULL” ]
VAR_DEF [ name=”f”; val = “0.0” ]
(Здесь “NULL” – значение по-умолчанию для переменных типа char*, a “0.0” – для переменных типа float).
5. Написать атрибутную грамматику, описывающую объявление переменных как в языке Си или Паскаль (на выбор). Для каждой переменной сохранить в атрибутах: название, тип данных и объём занимаемой памяти. Грамматика должна поддерживать объявление массивов.
Так, если есть цепочка
a[1..10]: array of integer;
b: real;
То при распознавании в дереве разбора должны встретиться два узла, например, следующего вида:
VAR_DEF [ name=”a”; type=”array of integer”; memory=”40”]
VAR_DEF [ name=”b”; type=”real”; memory=”6”]
(Здесь предполагается, что под переменную типа integer отводится 4 байта памяти.)
Подготовка к лабораторной работе
В процессе подготовки к лабораторной работе студент должен изучить соответствующие главы курса, после чего необходимо построить для заданного языка грамматику. Для этого он должен:
Выписать несколько примеров цепочек, принадлежащих заданному языку.
Проанализировать структуру выделенных цепочек – выделить в них начало, конец, повторяющиеся части и символы.
Выделить простейшие структуры, обозначая структурные части с помощью вводимых нетерминальных символов.
Для каждой из выделенных структурных частей построить правила грамматики.
Объединить все правила в грамматику.
Порядок выполнения работы
В процессе выполнения лабораторной работы студенту необходимо:
Используя текстовый редактор создать файл с грамматикой.
Проверить грамматику на соответствие формальным правилам описания и транслировать ее.
Запустить SAG и выполнить разборы цепочек. Определить, принадлежат ли выбранные цепочки языку. Порожденные цепочки записать в файл, используя команду Сохранить.
Если получены цепочки, которые не принадлежат языку, то необходимо изменить грамматику и повторить вывод цепочек.
По окончании лабораторной работы файлы с грамматикой и выведенными цепочками необходимо сохранить в архиве.