Trans6

advertisement
6. Лабораторно-практический курс
Лексический анализ
Тестовые варианты лексики для лексического анализатора на основе КА
Для заданного варианта лексики:

построить диаграмму состояний и переходов распознающего КА, обратить
внимание на количество возвращаемых символов в каждом заключительном
состоянии и на логику распознавания префиксов и суффиксов (начала и
окончания) лексем;

проверить правильность работы КА при помощи Java-приложения из п.5.1 или с
использованием программы lexan.cpp
1. 00111100 – цепочка, содержащая четное число подряд идущий единиц и нулей.
Подсказка: автомат имеет состояния, соответствующие получению четного 0,
нечетного 0, четной 1 и нечетной 1. Проверка лексической правильности всей
строки.
2. Цепочка символов a,b,c в любых сочетаниях. Лексема заканчивается цепочкой
одинаковых символов. Например: abcbbb|abcc|abababaaaa|abb. Подсказка:
состояния запоминают, какой был последний символ, и что этот символ
повторялся.
3. Лексемы вида +01 | +10 | + | 11010010 – после + лексема может содержать 01 или
10, любое другое сочетание (11 или 00) считается началом другой лексемы, перед
которой идет одиночный +. Например: +|+01|01110+|11010|+10 Подсказка: в
некоторых заключительных состояниях необходим возврат 2 символов.
4. Строка символов a,b,c, в которой любая пара одинаковых символов разделяется
символом «-», например a-a-abc-c-cb-b-bcaca-a. Проверка лексической
правильности всей строки. Подсказка: состояния запоминают, какой был
последний символ, и что за ним был символ «-».
5. Строка символов a,b,c, в которой любая пара различных символов разделяется
символом «-», например aaa-b-ccc-bbb-c-a-c-aa. Проверка лексической
правильности всей строки.
6. ((…)..(..)((..))) – строка, содержащая скобки. Если в строке есть
последовательность одинаковых скобок, то между ними не должно быть других
символов. Например, (aaa(aaa)) – строка с ошибкой. Проверка лексической
правильности всей строки. Подсказка: состояние запоминает, какая была
последняя скобка, и что за ней был хотя бы один символ.
7. Строка символов a,b, цепочка одинаковых символов считается лексемой, причем,
если за ней следует такая же цепочка, то она не включается в лексему, иначе к ней
присоединяется еще один символ. Например: aaa|bb|aaab|aab|aac|ababab|aa (!!!!).
8. Строка содержит символы a и *. Лексемами считаются цепочки из любого числа
символов a, а также нечетного числа символов * Подсказка: при контроле
четности просмотренных символов * использовать возврат 2 символов.
9. Строка цифр 1,2,3 в любой последовательности. Выделяется лексемы 12, 23, 31, а
также любые другие последовательности, например 12/31/23/23/1333/23/132.
Подсказка: в начальном состоянии отслеживается получение пар 12, 23, 31,
которые выделяются как лексемы. Для всех других последовательностей
© Теория языков программирования и методы трансляции
1.
производится переход в новые состояния, в которых появление этих же пар
приводит к распознаванию предыдущей лексемы и возврату 2 символов.
10. Строка содержит пробелы-разделители, цепочки символов a, точки и многоточия
(три точки). Лексемами считаются цепочки символов a, точки и троеточия,
например aaa|...|.|aaa|.|.|aaa|...|aaa Подсказка: использовать возврат 2 символов.
11. Строка символов a,b, лексемами считаются цепочки, в которых каждый символ
повторяется подряд более одного раза. Одиночные символы считаются
отдельными лексемами, например: aaabbbaabbbbb|a|bbaa|b|a|bbb. Подсказка:
использовать возврат 2 символов. (!!!!)
12. a+++a-aaa+a--+a - переменные из символов a, операции постинкремента и
постдекремента, сложения и вычитания - подряд могут идти 1 или 3 знака, в
последнем случае – первые два одинаковые (автомат проверяет правильность всей
цепочки).
13. Строка из символов a,b,c содержит лексемы ab,bc,ca, цепочки из остальных
сочетаний распознаются как отдельные лексемы (ab,bc,ca выступают как их
ограничители),
например:
aaa|bc|acba|ca|bbbbbabbba|bc.
Подсказка:
использовать возврат 2 символов. (!!!!)
14. Лексемы - (…..) , ((…..)) , (((….))) – одинарные, двойные или тройные парные
скобки, содержащие внутри любую цепочку символов. Меньшее количество
закрывающихся скобок не считается концом лексемы.
15. Строка содержит символы a и *. Лексемы содержат четное число * или a,
последний нечетный символ считается отдельной лексемой, например:
******|a|**|aa|a|*|aaaaaa|****|a|**|*|a|****|a.
16. Строка содержит символы a и *. Лексемами считаются сочетания *a и a*, а также
остальные цепочки, состоящие только из символов одного вида, например:
aa|a*|a*|***|*a|aa|a*|a*|**|*a|aaaa.
© Теория языков программирования и методы трансляции
2.
Варианты лексики к лабораторной работе №1
Для заданной лексики:

написать фрагмент программы неформального лексического анализа, используя
программную заготовку hardlex.cpp;

построить диаграмму состояний-переходов КА лексического анализатора;

определить классы символов и построить матрицу переходов КА. Проверить
работоспособность анализатора, используя программную заготовку lexan.cpp
или Java-приложение из п.3.1.
Вариант задания содержит 4-5 лексем из следующего списка (по умолчанию
используется синтаксис языка Си):
1. идентификаторы;
2. идентификаторы, начинающиеся и заканчивающиеся на s;
3. идентификаторы с s внутри;
4. идентификаторы, заканчивающиеся на ex;
5. целые константы без знака;
6. целые константы со знаком;
7. вещественные константы (в общем формате 5.6e6 и вида 5.5);
8. шестнадцатеричные константы вида 0x555ff;
9. шестнадцатеричные константы вида 5566ffh;
10. восьмеричные константы, начинающиеся с 0;
11. восьмеричные константы вида 5566o;
12. «диапазонные» константы вида +-1400;
13. операции <,<<,>,>>;
14. комментарии вида <>…<>;
15. операции +,++,-,--;
16. комментарии вида -+…+-;
17. комментарии вида =!…!=;
18. операции =,==,!=,!;
19. комментарии вида **…**;
20. операции вида *,***;
21. строковые константы вида ”………””…” (символ ” внутри
дублируется);
константы
22. комментарии вида ((…));
23. одинарные скобки (,);
24. «смайлики» вида :-) , :-( , :-)) , :-((.
© Теория языков программирования и методы трансляции
3.
Синтаксический анализ
Варианты тестовых LL(1)-грамматик для нисходящего разбора
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)
13)
14)
15)
16)
17)
18)
19)
20)
Z:S# S:aSb S:bA A:aA A:
Z:S# S:/*A*/ A:+A A:SA A:
Z:S# S:aB+S S: B:aB B:
Z:U# U:SU U: S:[U]
Z:E# E:TM M:+E M:-E M: T:[T] T:
Z:U# U:SU U: S:aA A:bA A:
Z:U# U:LU U: L:Sbc S:aS S:
Z:U# U:EU U: E:aSb S:aSb S:
Z:UM# M:,UM M: U:SN N:SN N: S:a S:b S:c
Z:N# N:UM M:,UM M: U:aSK S:aS S: K:[N] K:
Z:U# U:ST T:,ST T: S:BA B:*B B: A:aA A:
Z:U# U:aU U:{T}U U: T:bT T:{S}T T: S:cS S:
Z:U# U:aA A:aA A: A:bB B:bB B:cC C:cC C:bB B:aA
Z:T# T:UT T: U:<A A:U> A:-T-> A:>
Z:SU# U:+SU U:-SU U: S:<S> S:B B:*B B:aA A: aA A:
Z:U# U:SU U: S:<SS> S:aAb A:aAb A:
Z:SU# U:SU U: S:aAb S:[bBa] A:aAb A: B:bBa B:
Z:U# U:SU U: S:0 S:1[SU] S:2[SU][SU] S:3[[SU]]
Z:U# U: U:*U U:<U>S S: S:*S
Z:SU# U:SU U: S:a S:{aSb} S:[SU]
Варианты тестовых LR(1)-грамматик для восходящего разбора
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)
13)
14)
15)
16)
17)
Z:U#
Z:E#
Z:U#
Z:U#
Z:E#
Z:U#
Z:U#
Z:E#
Z:U#
Z:U#
Z:U#
S:SR
Z:A#
Z:U#
Z:T#
Z:U#
Z:U#
Z:L#
U:S U:US S:aA A:bA A:b
E:E+T E:E-T E:T T:[] T:[T]
U:US U:S S:A A:aA A:ab
U:US U:S S:[] S:[U]
E:E,T E:T T:a T:b T:Ta T:Tb
U:UE U:E E:Abc E:bc A:Aa A:a
U:UE U:E E:ab E:aEb
E:E,T E:T T:S[E] T:S S:Sa S:a
U:U,T U:T T:BA T:A B:B* B:* A:Aa A:a
U:U,T U:T T:*T T:A A:Aa A:a
U:UT U:T T:a T:{S}
S:R R:b R:{M} M:Mc M:c
A:Aa B:Ab B:Bb C:Bc C:Cc B:Cb A:Ba A:a
U:ABC A:Aa A:a B:Bb B:b C:Cc C:c
T:TU T:U U:<U> U:<-T-> U:<>
U:U+A A:*A U:A A:B A:B[U] B:Ba B:a
U:U+B U:B B:*B B:A A:Aa A:a
L:L,U L:U Y:*Y Y:X U:Y X:a X:X[]
© Теория языков программирования и методы трансляции
4.
3.1. Формальные грамматики и языки
Для заданного варианта тестовой грамматики:

определить множества терминальных и нетерминальных символов;

привести пример правильного предложения (синтаксически правильной цепочки
терминальных символов языка);

записать последовательность подстановок для получения правильного предложения
языка;

изобразить синтаксическое дерево, соответствующее построению правильного
предложения языка.
3.2. Взаимосвязь синтаксиса и формальных грамматик
Для заданного варианта тестовой грамматики:

определить, какую синтаксическую конструкцию продуцирует каждая группа
правил;

сформулировать в словесной форме синтаксис предложений языка;
3.3. Отношения между символами в формальных грамматиках
Для заданного варианта LL(1)-грамматик нисходящего разбора:

построить граф-схему вывода построения множеств FIRST и FOLLOW для
всех нетерминальных символов;

объяснить содержательный смысл множеств, исходя из вида цепочек,
продуцируемых грамматикой и соответствующим нетерминалом.

для построения множеств FIRST и FOLLOW можно использовать Javaприложение из п.5.2.
3.6. Автоматные методы нисходящего разбора
Для заданного варианта тестовой грамматики для нисходящего разбора:

сформулировать в словесной форме синтаксис предложений языка;

построить множества выбирающих символов, граф-схемы построения множеств
FIRST для правых частей правил, начинающихся с нетерминала, и множеств
FOLLOW для нетерминалов левой части аннулирующих правил;

для выбранного правильного предложения записать последовательность
действий магазинного автомата (МА) (состояние стека и входной строки, номер
применяемого правила);

построить синтаксическое дерево для этого же предложения, отметив на нем
номера шагов работы МА;

используя программу LL(1) из п.5.3 или Java-приложение из п.5.4 проверить
правильность полученных результатов.
3.7. Рекурсивный спуск
Для заданного варианта
распознаватель в двух вариантах:
тестовой
грамматики
© Теория языков программирования и методы трансляции
написать
программу
–
5.

используя исходный (канонический) вид грамматики и создавая для каждого
нетерминала свою функцию распознавания и предварительно вычисленные
множества выбирающих символов (в том числе и для аннулирующих правил);

минимизировав количество нетерминалов и соответствующих им процедур
(функций) распознавания, реализовав повторение синтаксических элементов в
виде явных циклов, а необязательные элементы - в виде проверок условий их
наличия.
3.9. Автоматные методы восходящего разбора
Для заданного варианта тестовой грамматики для восходящего разбора:

сформулировать в словесной форме синтаксис предложений языка;

построить
отношение
предшествования
–
перечислить
отношения
предшествования, следующие их каждого правила, заполнить таблицу
предшествования, указав около каждого элемента отношения номер правила, из
которого оно следует (например >5 );

для проверки правильности построения можно использовать Java-приложение
из п.5.5.

для выбранного правильного предложения записать последовательность
действий магазинного автомата (МА) (состояние стека и входной строки,
действие – перенос или свертка с номером правила, по которому она
производится);

построить синтаксическое дерево для этого же предложения, отметив на нем
номера шагов работы МА;

используя программу LR(1) из п.5.6. или Java-приложение из п.5.7, проверить
правильность полученных результатов.
© Теория языков программирования и методы трансляции
6.
Варианты синтаксиса к лабораторным работам №2-4
По умолчанию предполагается синтаксис языка Си.
1. Определение структурированного типа struct и контекстное определение
переменных на его основе вида struct a{…} <список определений переменных>;
При определении типов переменных используются операции [],*,(), – вызов
функции и приоритеты.
2. Контекстное определение типов данных для переменных, включая struct и
typedef. При определении типов переменных используются операции [],*,(), –
вызов функции и приоритеты.
3. Контекстное определение переменных c использованием операций [],*,(), – вызов
функции и приоритеты, а также объявление и определение функций. Тип
результата функции может быть только вида int *..* (любое количество
звездочек). Если первым в списке идет определение функции, то оно должно быть
единственным, если объявление функции или определение переменной — то
следующими могут быть элементыв того же вида.
4. Заголовок класса в Си++: метки public и private, объявление свойств (в том числе
объектов ранее определенных классов) и методов. Наследование.
5. Контекстное определение простых переменных, указателей, массивов и массивов
указателей с возможными инициализаторами в виде констант и переменных, с
синтаксической проверкой соответствия типа переменной и вида инициализатора.
Например: int a,a=c,a[]={c,c,c},*a=&a,*a[]={&a,&a};
6. Контекстное определение простых переменных, одномерных и двумерных
массивов с возможными инициализаторами в виде констант и переменных, с
синтаксической проверкой соответствия типа переменной и вида инициализатора.
Например: int a,a=c,a[]={c,c,c},a[][]={{a,a}{a,a}{a,a,a}};
7. Бейсик-подобный язык без определения типов переменных определяет
последовательность функций вида a(a,a,a…){ a=E;a[E]=E; a(); }. Операторами
языка являются 2 вида присваивания и вызов процедуры. Выражение E может
содержать вызов функции вида a(E,E,E,…).
8. Бейсик-подобный язык включает в себя арифметические выражения со скобками и
вызовом функций, операторы присваивания, структурированные операторы с
закрывающими ключевыми словами while-loop, for-next, if-then-else-endif (c else
и без него). Символ «;» используется как разделитель операторов одного уровня.
9. Java-подобный язык задает последовательность определения классов. В
грамматику «зашиты» имена базовых типов (int,char) и имена классов (например,
point, frame). Допустимы списки определений переменных и массивов с
инициализаторами, а также определения методов и объявления абстрактных
методов. Пример:
class a{
class a{…}
// Определение вложенного класса
int a,a=E,a[],a[]=new a[c],a[]={E,E,E,E};
// Определение данных класса
point a=new point(E,E);
int a(){}
int []a(int a){}
// Определение метода
int a();
// Объявление абстрактного метода
}
© Теория языков программирования и методы трансляции
7.
Лабораторная работа №2: формальные методы нисходящего синтаксического
анализа
Для заданного варианта синтаксиса:

разработать LL(1)-грамматику;

при помощи программы-распознавателя LL(1) из п.5.3. проверить
работоспособность грамматики. Формальная проверка заключается в том, что
множества выбирающих символов должны быть непересекающимися.
Содержательная проверка состоит в подтверждении того, что данная
грамматика действительно реализует требуемый синтаксис (вложенность,
приоритеты различных синтаксических единиц обеспечивается данной
грамматикой);

оформить отчет, в котором привести описание грамматики (группы правил, их
назначение, выбирающие символы), пример распознавания синтаксической
ошибки (состояние распознавателя в момент ее обнаружения и возможное на
основе его анализа сообщение об ошибке), граф-схемы построения множеств
выбирающих символов для аннулирующего правила и правила, начинающегося
с нетерминала, пример синтаксического дерева для правильного предложения.
Пример оформления отчета
Лабораторная работа №3: восходящий синтаксический анализ методом
«свертка-перенос»
Для заданного варианта синтаксиса:

разработать LR(1)-грамматику;

при помощи программы-распознавателя LR(1) из п.5.6 проверить
работоспособность грамматики. Формальная проверка заключается в том, что в
отношении предшествования отсутствуют конфликты типа «свертка-перенос».
Содержательная проверка состоит в подтверждении того, что данная
грамматика действительно реализует требуемый синтаксис (вложенность,
приоритеты различных синтаксических единиц обеспечивается данной
грамматикой);

оформить отчет, в котором привести описание грамматики (группы правил, их
назначение, множества FIRST и LAST* нетерминалов левой части), таблицу
отношения предшествования, пример распознавания синтаксической ошибки
(состояние распознавателя в момент ее обнаружения и возможное на основе его
анализа сообщение об ошибке). Построить все элементы отношения
предшествования, выводимые из двух заданных правил (с отметкой в таблице),
привести пример синтаксического дерева для правильного предложения.
Пример оформления отчета
Лабораторная работа №4: нисходящий синтаксический анализатор на основе
метода рекурсивного спуска
Для заданного варианта синтаксиса (к лабораторным работам №2-4) написать на
Си++ синтаксический анализатор, работающий по методу рекурсивного спуска.
Предусмотреть трассировку процесса работы анализатора, включающую вывод
сообщений о начале и завершении вызова распознавателя для каждого нетерминала с
выводов непросмотренной части входной строки. В отчете привести исходный текст
распознавателя и примеры обнаружения им синтаксических ошибок.
© Теория языков программирования и методы трансляции
8.
Пример оформления отчета
Семантический анализ и генерация кода. Курсовая работа
Дополнить синтаксический анализатор на основе метода рекурсивного спуска
cемантической составляющей. Разработатать внутреннюю структуру данных,
соответствующую анализируемой семантике (семантические таблицы), дополнить
синтакичсеский анализатор компонентами семантического анализа, интерпретации или
генерации кода.
1. Си-грамматика арифметических выражений со скобками, операторов
<выражение>; , for, if (c else и без него), и блочных скобок. Семантика:
форматирование исходного текста программы согласно уровню вложенности
операторов.
2. Вариант 2 для Бейсик-грамматики арифметических выражений со скобками,
операторов присваивания, for-next, if-then-else-endif (c else и без него). Символ ;
используется как разделитель операторов.
3. Си-грамматика арифметических выражений со скобками, операторов
<выражение>; , for, if (c else и без него), и блочных скобок. Семантика:
генератор программного кода для стековой машины и интепретатор этого кода
(система команд стековой машины: бинарные операции над стеком, загрузка в
стек ячеек памяти и констант, сохранение в стеке, ввод и вывод данных из стека,
безусловный и условный переходы по относительному адресу по проверяемому
значению в вершине стека).
4. Вариант 3 для Бейсик-грамматики арифметических выражений со скобками,
операторов присваивания, for-next, if-then-else-endif (c else и без него). Символ ;
используется как разделитель операторов.
5. Си-грамматика арифметических выражений со скобками, операций *,&, (), [],
<точка>, -> Семантика: восстановление типа данных идентификатора по виду
выражения.
6. Определение структурированного типа struct и контекстное определение
переменных на его основе: struct a{…} a,a[c]; Семантика: проверка
семантической правильности выражений над этими переменными (включая
арифметику со скобками).
7. Си-грамматика выражений для арифметических операций, вызова функций,
присваивания и скобок. Семантика: создание в памяти синтаксического дерева
(каждый распознаватель возвращает указатель на корневую вершину) и
сохранение его в текстововм файле в рекурсивном саморазворачивающемся
формате.
8. Загрузка в память синтаксического дерева, заданного в текстовом файле в
рекурсивном саморазворачивающемся формате и преобразование его в дерево
операций.
9. Грамматика определения функции вида a(a,a,a…){ E=a;E=a;E; }. Программа
представляет собой последовательность определений функций. Выражение может
содержать вызов функции вида a(E,E,E,…). Семантика: Движок-интерпретатор
реализует вызов и возврат из функции. В теле функции могут использоваться
целые константы, имена формальных параметров и имя функции как результат.
Остальные имена считаются локальными перемеными.
10. Вариант 9. Семантика: генератор кода для стековой машины с передачей
формальных параметров и результата через стек и интерпретатор этого кода. В
системе команд предусмотрен дополнительный указатель на фрейм стека (аналог
© Теория языков программирования и методы трансляции
9.
регистра bp). При интерпретации команды call он сохраняется в стеке наряду с
точкой возврата и в него копируется текущее значение sp.
11. Си-грамматика контекстного определения глобальных и локальных переменных и
определения и объявления функций. Семантика: структура данных, содержащая
информацию о типах определенных в программе объектов. Проверка соответствия
определений и объявлений функций.
12. Контекстное определение типов данных для переменных, включая struct, typedef.
Семантика: структура данных, содержащая информацию о типах определенных в
программе объектов.
13. Заголовок класса в Си++: метки public и private, объявление свойств (в том числе
объектов ранее определенных классов) и методов. Наследование. Cемантика:
структура данных, содержащая информацию о классе, всех его компонентах и
правах доступа.
© Теория языков программирования и методы трансляции
10.
Download