Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Грамматика АТ в2.doc
Скачиваний:
11
Добавлен:
16.05.2015
Размер:
946.18 Кб
Скачать

Задания

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 байта памяти.)

  1. Подготовка к лабораторной работе

В процессе подготовки к лабораторной работе студент должен изучить соответствующие главы курса, после чего необходимо построить для заданного языка грамматику. Для этого он должен:

  1. Выписать несколько примеров цепочек, принадлежащих заданному языку.

  2. Проанализировать структуру выделенных цепочек – выделить в них начало, конец, повторяющиеся части и символы.

  3. Выделить простейшие структуры, обозначая структурные части с помощью вводимых нетерминальных символов.

  4. Для каждой из выделенных структурных частей построить правила грамматики.

  5. Объединить все правила в грамматику.

  1. Порядок выполнения работы

В процессе выполнения лабораторной работы студенту необходимо:

  1. Используя текстовый редактор создать файл с грамматикой.

  2. Проверить грамматику на соответствие формальным правилам описания и транслировать ее.

  3. Запустить SAG и выполнить разборы цепочек. Определить, принадлежат ли выбранные цепочки языку. Порожденные цепочки записать в файл, используя команду Сохранить.

  4. Если получены цепочки, которые не принадлежат языку, то необходимо изменить грамматику и повторить вывод цепочек.

  5. По окончании лабораторной работы файлы с грамматикой и выведенными цепочками необходимо сохранить в архиве.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]