6a9e8f7356ef4dbb4afdd7fc36a5835d.ppt
- Количество слайдов: 35
Лабораторные работы 1
Лабораторные работы 2 Порядок выполнения лабораторных работ: 1. Описать требуемый язык заданным способом (в виде ДКА, ДМПА, РВ или грамматики вида LL(1)/LR(1)). 2. Написать программу, реализующую заданный механизм синтаксического анализа. 3. Внедрить в синтаксис анализатора действия для проверки семантики языка или его интерпретации. 4. Протестировать программу. 5. Написать отчёт, включающий все требуемые пункты (в т. ч. формальное описание построенного анализатора) и удовлетворяющий требованиям ОС ТУСУР 01 -2013.
Лабораторная работа № 1 3 Вариант № 1. Требования к программе: Должны быть явно описаны все компоненты ДКА (можно, но не обязательно, использовать ДМПА) – Q (если состояния именованные), Σ, δ, q 0, F (если маркер не добавлен в функцию переходов). Должно быть реализовано управляющее устройство автомата в виде функции или процедуры, работающее по описанному в пособии алгоритму. Должны быть описаны внедрённые в синтаксис автомата действия в виде отдельной функции или процедуры. Действия должны обеспечивать проверку всей семантики языка.
Лабораторная работа № 1 4 Вариант № 1. Требования к программе: При запуске программа должна считывать входную цепочку из файла с именем input. txt. Программа должна корректно завершать свою работу независимо от содержимого входного файла. Результаты работы программа должна вывести на консоль или в выходной файл output. txt. При этом, если входная цепочка содержала ошибку, в выходных данных необходимо указать её положение (номер строки и позицию в строке). Также можно указать дополнительные сведения о причине ошибки.
Лабораторная работа № 1 5 Пример: +, – q 0 . 0 -9 q 1 q 2 q 3 q 4 Знак можно использовать только в начале числа q 4 q 3 HALT q 4 HALT Ожидается символ « 0 -9»
Лабораторная работа № 1 6 Вариант № 2. Требования к программе: Должны быть явно описаны все компоненты ДМПА – Q (если состояния именованные), Σ, Γ, δ, q 0, γ 0, F (если маркер не добавлен в функцию переходов). Должно быть реализовано управляющее устройство автомата в виде функции или процедуры, работающее по описанному в пособии алгоритму. Должны быть описаны внедрённые в синтаксис автомата действия в виде отдельной функции или процедуры. Действия должны обеспечивать построение дерева заданного выражения (или кода, если этап построения дерева пропускается).
Лабораторная работа № 1 7 Вариант № 2. Требования к программе: При запуске программа должна считывать входную цепочку из файла с именем input. txt. Программа должна корректно завершать свою работу независимо от содержимого входного файла. Результаты работы программа должна вывести в выходной файл output. txt. При этом, если входная цепочка содержала ошибку, сообщение об этом выводится в выходной файл, а таблица имён и код не формируются.
Лабораторная работа № 1 8 Вариант № 2. Способы формирования кода: выражение ДМПА построение дерева внедрёнными действиями дерево …; выражение ДМПА построение ОПЗ внедрёнными действиями ОПЗ …; выражение ДМПА построение ОПЗ, где операндами являются узлы дерева дерево …; выражение ДМПА использование стека ОПЗ для хранения кусков кода код …; и т. д.
Лабораторная работа № 1 9 Вариант № 3. Требования к программе: В программе должно быть описано единственное РВ, полностью описывающее заданный язык. Для анализа РВ рекомендуется применять уже готовые классы и библиотеки (Regex и т. п. ). Внедрение в синтаксис РВ действий и поиск позиции ошибки обеспечивается добавлением нумерованных и именованных групп. (…) (? <имя>…) (? 'имя'…) Требования к входным и выходным данным – аналогично варианту № 1.
Лабораторная работа № 1 10 Вариант № 4. Требования к программе: В программе должно быть описано единственное РВ, полностью описывающее заданный язык. Для анализа РВ рекомендуется применять уже готовые классы и библиотеки (Regex и т. п. ). Внедрение в синтаксис РВ действий обеспечивается добавлением нумерованных и именованных групп (позицию ошибки определять не нужно). (…) (? <имя>…) (? 'имя'…) Требования к входным и выходным данным – аналогично варианту № 2.
Лабораторная работа № 1 11 Способы поиска ошибок при помощи РВ: Построить РВ так, чтобы выделить все правильные совпадения во входной цепочке и искать разрывы между ними: int a, 12 b, c 3[10], x[]; Построить РВ так, чтобы выделить правильную часть цепочки, начиная от её начала: int a, 12 b, c 3[10], x[]; Для этого используются утверждения просмотра вперёд и назад нулевой длины: (? !. . . ) (? <=…) (? <!. . . ) (? >…)
Домашнее задание 12 Язык L описывает обращение к элементу массива. При этом размерность массива может быть любой, а в качестве индексов можно использовать целые константы i ≥ 0, а также идентификаторы, в т. ч. элементы других массивов. Идентификатор начинается с латинской буквы, после которой могут следовать другие буквы и цифры. Индексы заключаются в квадратные скобки и отделяются друг от друга запятыми. Например: a[1]; a 2[5, b[2], z]; mas[x[4], y[4]] и т. д.
Домашнее задание 13 Вариант 1: const string pattern = @"^ ( (? <=^|, |[) (? <op>[a-z]+) (? =, |[|]) ) ( (? <=, |[) (? <op>d+) (? =, |]) ) ( (? <=[a-z]|d|]) (? <op>, ) (? =[a-z]|d) ) (? <level> (? <=[a-z]) (? <op>[) (? =[a-z]|d) ) (? <-level> (? <=[a-z]|d|]) (? <op>]) (? =, |]|$) ) )+ (? (level)(? !)) )$"; Regex r = new Regex(pattern, Regex. Options. Ignore. Pattern. Whitespace); | |
Домашнее задание 14 Вариант 1: abc[12, zz[10], tt, zx[zy[5], q]] Соответствие 1 Группа 1 = 'abc[12, zz[10], tt, zx[zy[5], q]]' Захват 0 = 'abc[12, zz[10], tt, zx[zy[5], q]]', позиция = 0, длина = 29 Группа 2 = ']' Захват 0 = 'abc', позиция = 0, длина = 3 Захват 1 = '[', позиция = 3, длина = 1 Захват 2 = '12', позиция = 4, длина = 2 Захват 3 = ', ', позиция = 6, длина = 1 Захват 4 = 'zz', позиция = 7, длина = 2 Захват 5 = '[', позиция = 9, длина = 1 Захват 6 = '10', позиция = 10, длина = 2 Захват 7 = ']', позиция = 12, длина = 1 Захват 8 = ', ', позиция = 13, длина = 1 Захват 9 = 'tt', позиция = 14, длина = 2 Захват 10 = ', ', позиция = 16, длина = 1 Захват 11 = 'zx', позиция = 17, длина = 2 Захват 12 = '[', позиция = 19, длина = 1 Захват 13 = 'zy', позиция = 20, длина = 2 Захват 14 = '[', позиция = 22, длина = 1 Захват 15 = '5', позиция = 23, длина = 1 Захват 16 = ']', позиция = 24, длина = 1 Захват 17 = ', ', позиция = 25, длина = 1 Захват 18 = 'q', позиция = 26, длина = 1 Захват 19 = ']', позиция = 27, длина = 1 Захват 20 = ']', позиция = 28, длина = 1 Группа 3 = 'q' Захват 0 = 'abc', позиция = 0, длина = 3 Захват 1 = 'zz', позиция = 7, длина = 2 Захват 2 = 'tt', позиция = 14, длина = 2 Захват 3 = 'zx', позиция = 17, длина = 2 Захват 4 = 'zy', позиция = 20, длина = 2 Захват 5 = 'q', позиция = 26, длина = 1 Группа 4 = '5' Захват 0 = '12', позиция = 4, длина = 2 Захват 1 = '10', позиция = 10, длина = 2 Захват 2 = '5', позиция = 23, длина = 1 Группа 5 = ', ' Захват 0 = ', ', позиция = 6, длина = 1 Захват 1 = ', ', позиция = 13, длина = 1 Захват 2 = ', ', позиция = 16, длина = 1 Захват 3 = ', ', позиция = 25, длина = 1 Группа 6 = ']' Захват 0 = 'abc', позиция = 0, длина = 3 Захват 1 = '[', позиция = 3, длина = 1 Захват 2 = '12', позиция = 4, длина = 2 Захват 3 = ', ', позиция = 6, длина = 1 Захват 4 = 'zz', позиция = 7, длина = 2 Захват 5 = '[', позиция = 9, длина = 1 Захват 6 = '10', позиция = 10, длина = 2 Захват 7 = ']', позиция = 12, длина = 1 Захват 8 = ', ', позиция = 13, длина = 1 Захват 9 = 'tt', позиция = 14, длина = 2 Захват 10 = ', ', позиция = 16, длина = 1 Захват 11 = 'zx', позиция = 17, длина = 2 Захват 12 = '[', позиция = 19, длина = 1 Захват 13 = 'zy', позиция = 20, длина = 2 Захват 14 = '[', позиция = 22, длина = 1 Захват 15 = '5', позиция = 23, длина = 1 Захват 16 = ']', позиция = 24, длина = 1 Захват 17 = ', ', позиция = 25, длина = 1 Захват 18 = 'q', позиция = 26, длина = 1 Захват 19 = ']', позиция = 27, длина = 1 Захват 20 = ']', позиция = 28, длина = 1 Группа 7 = ''
Домашнее задание 15 Вариант 2: const string pattern = @"^ (? : (? <=^|, |[) (? <op>[a-z]+) (? =, |[|]) ) (? : (? <=, |[) (? <op>d+) (? =, |]) ) (? : (? <=[a-z]|d|]) (? <op>, ) (? =[a-z]|d) ) (? <level> (? <=[a-z]) (? <op>[) (? =[a-z]|d) ) (? <-level> (? <=[a-z]|d|]) (? <op>]) (? =, |]|$) ) )+ (? (level)(? !)) )$"; Regex r = new Regex(pattern, Regex. Options. Ignore. Pattern. Whitespace); | |
Домашнее задание 16 Вариант 2: abc[12, zz[10], tt, zx[zy[5], q]] Соответствие 1 Группа 1 = ']' Захват 0 = 'abc', позиция = 0, длина = 3 Захват 1 = '[', позиция = 3, длина = 1 Захват 2 = '12', позиция = 4, длина = 2 Захват 3 = ', ', позиция = 6, длина = 1 Захват 4 = 'zz', позиция = 7, длина = 2 Захват 5 = '[', позиция = 9, длина = 1 Захват 6 = '10', позиция = 10, длина = 2 Захват 7 = ']', позиция = 12, длина = 1 Захват 8 = ', ', позиция = 13, длина = 1 Захват 9 = 'tt', позиция = 14, длина = 2 Захват 10 = ', ', позиция = 16, длина = 1 Захват 11 = 'zx', позиция = 17, длина = 2 Захват 12 = '[', позиция = 19, длина = 1 Захват 13 = 'zy', позиция = 20, длина = 2 Захват 14 = '[', позиция = 22, длина = 1 Захват 15 = '5', позиция = 23, длина = 1 Захват 16 = ']', позиция = 24, длина = 1 Захват 17 = ', ', позиция = 25, длина = 1 Захват 18 = 'q', позиция = 26, длина = 1 Захват 19 = ']', позиция = 27, длина = 1 Захват 20 = ']', позиция = 28, длина = 1 Группа 2 = ''
Лабораторная работа № 2 17 Требования к программе: Описание языка находится не в программе, как в ЛР№ 1, а в отдельном входном файле – grammar. txt. Грамматика состоит из четырёх компонентов – N, Σ, P, S. Однако, в файле grammar. txt можно описать только правила P. В этом случае нетерминалами N будут являться символы, встречающиеся в левых частях правил, терминалами Σ – все остальные символы правил (кроме пустой цепочки e и других специальных символов – вывода, альтернативы, внедрения действий и т. п. ), стартовым символом S будет являться нетерминал в левой части первого правила.
Лабораторная работа № 2 18 Пример: FIXED SIGN MANT SIGN + <A 1> | – <A 1> | e MANT . <A 2> NUM | NUM FRACT NUM 0 -9 <A 3> NUM 2 NUM | e FRACT . <A 2> NUM 2 | e Однако, при желании можно все эти компоненты описать явно.
Лабораторная работа № 2 19 Требования к программе: Файл с грамматикой должен быть один, и приведённая в нём грамматика должна полностью описывать заданный язык. Вначале программа загружает описание грамматики из файла grammar. txt и проверяет её на корректность. Если грамматика некорректна, сообщение об этом выводится в выходной файл и программа завершает работу. Иначе она должна построить таблицу разбора по приведённому в учебном пособии алгоритму.
Лабораторная работа № 2 20 Требования к программе: Затем программа считывает входную цепочку из файла с именем input. txt и проверяет её синтаксис и семантику, используя построенную таблицу разбора. Для проверки семантики в синтаксис грамматики должны быть внедрены действия. Программа должна корректно завершать свою работу независимо от содержимого входного файла. Результаты работы программа должна вывести на консоль или в выходной файл output. txt.
Грамматики 21
Основные определения 22 Грамматикой называется четверка G = (N, Σ, P, S), где: N – конечное множество нетерминальных символов или нетерминалов; Σ – непересекающееся с N конечное множество терминальных символов (терминалов); P – конечное подмножество множества (N Σ)*N(N Σ)*, элемент (α, β) множества P называется правилом (порождающим правилом или продукцией) и записывается α β; S – выделенный символ из N, называемый начальным (стартовым, исходным) символом.
Основные определения 23 Классификация грамматик по виду правил: Грамматики общего вида (или грамматики без ограничений): α β Контекстно-зависимые грамматики: α β, |α| |β| α (N Σ)*N(N Σ)*, β (N Σ)* Контекстно-свободные грамматики: A β, A N, β (N Σ)*
Основные определения 24 Грамматика определяет язык рекурсивным образом. Рекурсивность проявляется в задании особого рода цепочек, называемых выводимыми цепочками грамматики G = (N, Σ, P, S), где: 1) S – выводимая цепочка; 2) если αβγ – выводимая цепочка и β δ P, то αδγ – тоже выводимая цепочка. Выводимая цепочка грамматики G, не содержащая нетерминальных символов, называется терминальной цепочкой, порождаемой грамматикой G.
Основные определения 25 Обозначение вывода: φ G ψ – цепочка ψ непосредственно выводится из цепочки φ в языке, заданном грамматикой G (или просто φ ψ). φ k ψ – цепочка ψ выводится из цепочки φ за k операций вывода; φ + ψ – для вывода цепочки ψ из цепочки φ требуется от 1 и более операций вывода; φ * ψ – для вывода цепочки ψ из цепочки φ требуется от 0 и более операций вывода.
Основные определения 26 Обозначение вывода: Левосторонний вывод. Если α β P, то вывод φαψ φβψ называется левосторонним и обозначается φαψ L φβψ Правосторонний вывод. Если α β P, то вывод φβψ φαψ называется правосторонним и обозначается φαψ R φβψ
Основные определения 27 Пример КЗ-грамматики: S 0 A 1 0 A 0 0 A 1 A e Левосторонний вывод: S L 0 A 1 L 0 0 A 1 1 L 0 0 1 1 Поэтому можно сказать, что S L 3 0 0 1 1, или S L+ 0 0 1 1, или S L* 0 0 1 1.
Основные определения 28 Пример КЗ-грамматики: S 0 A 1 0 A 0 0 A 1 A e Правосторонний вывод: 0 0 1 1 R 0 0 A 1 1 R 0 A 1 R S Поэтому можно сказать, что S R 3 0 0 1 1, или S R+ 0 0 1 1, или S R* 0 0 1 1.
Контекстно-свободные грамматики 29
Основные определения 30 КС-грамматики Классификация КС-грамматик: LL(k)-грамматики Праволинейные грамматики LR(k)-грамматики Неукорачивающие грамматики Нормальная форма Хомского Нормальная форма Грейбаха
Основные определения 31 Как проверить, что входная цепочка α является правильной в языке L? Используя левосторонний вывод, вывести из стартового символа грамматики S искомую цепочку: S L* α Используя правосторонний вывод, вывести из искомой цепочки стартовый символ грамматики S : S R* α Построить деревья вывода. Если искомая цепочка является кроной одного из деревьев вывода, то она является правильной.
Деревья вывода 32 Упрощённый способ построения дерева вывода для цепочки α = α 1α 2…αn: 1. Поместить цепочку α в корень дерева вывода. 2. Выбрать произвольный элемент цепочки αi. 3. Если это нетерминал αi = A N, а во множестве правил P имеется правило вида A β 1 | β 2 | … | βm, то добавить в дерево новые узлы с цепочками α 1α 2…αi– 1βjαi+1…αn, где j = 1, 2, …, m. 4. Если в цепочке α не осталось нетерминалов, то это лист дерева. Повторять пункты 2 -3, пока в дереве не останутся только листья.
Деревья вывода 33 Пример. Построим дерево вывода для грамматики FIXED SIGN MANT SIGN + | – | e MANT . NUM | NUM FRACT NUM 0 -9 NUM 2 NUM | e FRACT . NUM 2 | e Подряд идущие символы – конкатенация (читается как «и» ), альтернатива – объединение (читается как «или» ).
Деревья вывода 34 Примечание. Эту грамматику можно записать без использования знака альтернативы: … SIGN + SIGN – SIGN e … MANT . NUM MANT NUM FRACT и т. д.
Деревья вывода 35 FIX S M + M – M M +. N + N FR –. N – N FR . N N FR … … –. 1 N 2 – 1 N 2 FR … … –. 1 N –. 1 e – 1 N FR –. 11 N 2 FIX S M S + | – | e M . N | N FR N 0 -9 N 2 N | e FR . N 2 | e – 11 N 2 FR … – 1 FR – 1. N 2 … – 1. N – 1. e – 1. 1 N 2 – 1. 1 N … – 1 e – 1. 1 e
6a9e8f7356ef4dbb4afdd7fc36a5835d.ppt