Макаров В.А. «Теория языков программирования и методы трансляции» (практика) 1. АВТОМАТ набрал Тейс Г., гр.2091 1 Автомат – некая математическая модель: <Q, X, δ, q0, Q’>, где Q – множество состояний, X – множество входных символов (алфавит), δ – функция перехода: δ(q,X) q’ – конкретное правило, q0 – одно единственное входное состояние: q0 Q, Q’ – множество конечных состояний. Конечное состояние будем помечать так: a n автомат x y где x – входная цепочка, y – выходная цепочка 2. РЕГУЛЯРНЫЕ ЦЕПОЧКИ Автомат 1. алфавит 2. состояние 3. функция перехода 4. начальное состояние 5. конечные состояния Грамматика 1. алфавит 2. правила Таблица переходов Регулярная цепочка – цепочка, составленная по правилам грамматики Регулярная цепочка – цепочка, которая может быть распознана распознающим автоматом ε – пустая цепочка (всегда регулярная) По заданным правилам переходов составляем таблицу переходов. Если две регулярные цепочки abcb и bcac допустимы, то 1. abcbbcac – цепочка, образованная при конкатенации этих двух является регулярным выражением. N 2. abcbabcb – итерация одной регулярной цепочки L i i 1 N 3. замыкание Клини (Kleene) – L i i 0 4. Объединение – объединение регулярных цепочек разных языков (L, S), обработанных разными автоматами (L U S) 3. АЛГОРИТМЫ ПОИСКА 1. Бинарный поиск Условие работы: список слов должен быть лексографически (в алфавитном порядке) упорядочен. Для поиска слова в словаре, словарь делим пополам и среднее слово сравниваем с искомым. Если оно совпадает, то поиск окончен, если нет, то смотрим, в верхней или нижней части словаря находится это слово. Делим эту часть пополам. И снова проверяем… Трудоёмкость: log2N 2. Метод линейного списка Приводим список в соответствии с частотой появления слов. Можно хранить и длину слова. Вначале проверяем по длине слова, потом пробегаем по списку слов… Трудоёмкость: меньше n/2 3. Хеширование Один из самых распространенных и оптимальных методов. Выбираем функцию хеширования F(x)=k, 0<k<m. Все зависит от того, какую функцию мы выберем. Трудоёмкость: n/m 4. Метод индексов Смотреть 3) при условии, что m=n Трудоёмкость: ~время определения индекса Макаров В.А. «Теория языков программирования и методы трансляции» (практика) 4. ПРАВОЛИНЕЙНАЯ ГРАММАТИКА набрал Тейс Г., гр.2091 2 Праволинейная грамматика – грамматика, в которой правая часть каждого правила содержит не более одного терминального символа. Преобразование в праволинейную грамматику: Пример 1 Пример 2 A a b A ab b b A a bcB A abc B bcB b cB cB c B Задана грамматика: 1. <S> a<A> 2. <S> bc 3. <S> <A> 4. <A> abb<S> 5. <A> c<A> 6. <A> ε Задача: построить автомат. 2,3,4 правила нуждаются в преобразовании. S b c 2. S bc c c . Обозначение «ε» тут несущественно. Можно записать любой символ. A a bbS 4. A abb S bbS b bS bS b S S a bbS 3. S A S c A - здесь просто переписываем все случаи чему равно <A> S В результате получаем следующую грамматику: 1. <S> a<B> 2. <S> b<cε> 3. <cε> c<ε> 4. <ε> ε 5. <S> a<bbS> 6. <bbS> b<bS> 7. <bS> b<S> 8. <S> c<A> 9. <S> ε 10. <A> a<bbS> 11. <A> c<A> 12. <A> ε Что можно записать следующей таблицей: a <S> <A>,<bbS> - недетерминированность <cε> <ε> <bbS> <A> <bbS> <bs> - b <cε> <bs> <S> c <A> <ε> <A> - допустимо допустимо допустимо - Макаров В.А. «Теория языков программирования и методы трансляции» (практика) 5. ГРАММАТИКА набрал Тейс Г., гр.2091 Грамматика: I. Структура 1. Описание переменных (int, string) 2. Тело программы II. Операторы (зарезервированные слова, операции и т.д.) 1. Input [имя_переменной] // функция ввода 2. Output [имя_переменной] // функция вывода 3. Арифметические операции: только бинарные 4. Логические операции: только бинарные > < <= >= <> = and or xor 5. Оператор присваивания: := 6. Оператор цикла: while <логическое_выражение> 7. Оператор условия: if (без else) 8. Блок: { } 9. Разделитель операторов: ; III. Синтаксис операторов 1. <описание_переменных> (<описание_переменной>;) 2. <описание_переменной> <имя_типа> <список_переменных> 3. <имя_типа> int | string 4. <список_переменных> id 5. <список_переменных> id(,id) 6. <ввод> input[id]; 7. <вывод> output[id]; 8. <присваивание> id:=<ариф_выражение> | <str_выражение>; 9. <ариф_выражение> <операнд_int><знак_операции><операнд_int>; 10. <операнд_int> id | num 11. <операция> + | - | * | div 12. <строка> ’<набор_символов>’ 13. <набор_символов> (a..z | A..Z | 0..9) 14. <str_выражение> <операнд_str>+<операнд_str> 15. <блок> {<последовательность_операторов>} 16. <последовательность_операторов> <оператор>; <последовательность_операторов> 17. <последовательность_операторов> ε 18. <оператор цикла> while <логическое_выражение> <блок>; 19. <условие> if <логическое_выражение> <блок>; и т.д. Пример 1: 1. <E> <E>+<T> 2. <E> <T> 3. <T> <T>*<P> 4. <T> <P> 5. <P> (<E>) 6. <P> a 7. <P> b {a,b,(} {a,b,(} {a,b,(} {a,b,(} {(} {a} {b} Шаг 1. Проверка корректности грамматик: проверка достижимости символов и продуктивности + Шаг 2. Находим множества выбора – множества выбора пересекаются. Значит это не LL(1)-грамматика. Грамматику разобрать нисходящими методами нельзя. Пример 2: 1. <A> a<B>a{y}<D> 2. <A> b 3. <B> b{x}<D> 4. <B> a<B> 5. <D> d<A> 6. <D> ε {a} {b} {b} {a} {d} СЛЕД(<D>)={ ,a} 3 Макаров В.А. «Теория языков программирования и методы трансляции» (практика) набрал Тейс Г., гр.2091 Шаг 1. Проверка корректности грамматик: проверка достижимости символов и продуктивности + Шаг 2. Находим множества выбора – множества выбора не пересекаются Значит это Q-грамматика Входные символы: {a,b,d, } Магазинные символы: {<A>,<B>,<D>,{y}, } <A> <B> <D> {y} a #1: #2: #3: #4: #5: #6: a #1 #3 #5 Выполнить(y) Вытолкнуть, Сдвиг Отвергнуть b #2 #4 Отвергнуть Выполнить(y) Отвергнуть Отвергнуть Заменить(<D>{y}a<B>), Сдвиг Вытолкнуть, Сдвиг Заменить(<B>), Сдвиг Заменить(<D>{x}), Сдвиг Вытолкнуть, Держать Заменить(<A>), Сдвиг d Отвергнуть Отвергнуть #6 Выполнить(y) Отвергнуть Отвергнуть Отвергнуть Отвергнуть #5 Выполнить(y) Отвергнуть Допустить 4