Документ 870397

реклама
Макаров В.А. «Теория языков программирования и методы трансляции» (практика)
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
Скачать