Изменены ссылки на заголовки внутри файлов
This commit is contained in:
@@ -1,24 +1,24 @@
|
||||
## Содержание
|
||||
- [Формальные грамматики](#Формальные%20грамматики)
|
||||
- [Основы](#Основы)
|
||||
- [Форма Бэкуса-Наура](#Форма%20Бэкуса-Наура)
|
||||
- [Пример вывода строки](#Пример%20вывода%20строки)
|
||||
- [Спецификация языка](#Спецификация%20языка)
|
||||
- [Теория автоматов](#Теория%20автоматов)
|
||||
- [История](#История)
|
||||
- [Иерархия Хомского](#Иерархия%20Хомского)
|
||||
- [Конечный автомат](#Конечный%20автомат)
|
||||
- [ДКА и НКА](#ДКА%20и%20НКА)
|
||||
- [Регулярные выражения и автоматы](#Регулярные%20выражения%20и%20автоматы)
|
||||
- [Построение Томпсона](#Построение%20Томпсона)
|
||||
- [Минимизация](#Минимизация)
|
||||
- [Границы конечных автоматов](#Границы%20конечных%20автоматов)
|
||||
- [Формы представления конечного автомата](#Формы%20представления%20конечного%20автомата)
|
||||
- [Примеры конечных автоматов](#Примеры%20конечных%20автоматов)
|
||||
- [Автомат для идентификаторов](#Автомат%20для%20идентификаторов)
|
||||
- [Автомат для комментариев](#Автомат%20для%20комментариев)
|
||||
- [Автомат для регулярного выражения](#Автомат%20для%20регулярного%20выражения)
|
||||
- [Автомат для четного числа символов "a"](#Автомат%20для%20четного%20числа%20символов%20"a")
|
||||
- [[#Формальные грамматики]]
|
||||
- [[#Основы]]
|
||||
- [[#Форма Бэкуса-Наура]]
|
||||
- [[#Пример вывода строки]]
|
||||
- [[#Спецификация языка]]
|
||||
- [[#Теория автоматов]]
|
||||
- [[#История]]
|
||||
- [[#Иерархия Хомского]]
|
||||
- [[#Конечный автомат]]
|
||||
- [#ДКА и НКА]]
|
||||
- [[#Регулярные выражения и автоматы]]
|
||||
- [[#Построение Томпсона]]
|
||||
- [[#Минимизация]]
|
||||
- [[#Границы конечных автоматов]]
|
||||
- [[#Формы представления конечного автомата]]
|
||||
- [[#Примеры конечных автоматов]]
|
||||
- [[#Автомат для идентификаторов]]
|
||||
- [[#Автомат для комментариев]]
|
||||
- [[#Автомат для регулярного выражения]]
|
||||
- [[#Автомат для четного числа символов "a"]]
|
||||
|
||||
## Формальные грамматики
|
||||
|
||||
@@ -98,20 +98,20 @@
|
||||
|
||||
<block> ::= "{" <statement>* "}"
|
||||
```
|
||||
Про звезду * в последней строке после `<statement>` поговорим [чуть позже](#Построение%20Томпсона).
|
||||
Про звезду * в последней строке после `<statement>` поговорим [[#Построение Томпсона|чуть позже]].
|
||||
|
||||
В примере видно, что `<statement>` ссылается сам на себя, используя для этого `<if-statement>` и `<block>`. Такая рекурсивная вложенность в грамматике и делает синтаксис язык [контекстно-свободным, а не регулярным](#Иерархия%20Хомского).
|
||||
В примере видно, что `<statement>` ссылается сам на себя, используя для этого `<if-statement>` и `<block>`. Такая рекурсивная вложенность в грамматике и делает синтаксис язык [[#Иерархия Хомского|контекстно-свободным, а не регулярным]].
|
||||
## Теория автоматов
|
||||
### История
|
||||
|
||||
Изначально, теория автоматов родилась не из программирования, а из вопроса "что вообще значит вычислять?". Программирование появилось позже, как массовая практика, и унаследовало уже готовый аппарат.
|
||||
|
||||
В самом начале, в 1943 году, [Уоррен Маккаллок](https://ru.wikipedia.org/wiki/Мак-Каллок,_Уоррен) и [Уолтер Питтс](https://ru.wikipedia.org/wiki/Питтс,_Уолтер) создали [формальную модель нейрона](https://ru.wikipedia.org/wiki/Искусственный_нейрон), которая по своей сути является переключательным автоматом. В 1950-ых годах [Стивен Клини](https://ru.wikipedia.org/wiki/Клини,_Стивен_Коул) вывел [связь регулярных выражений и конечных автоматов](#Регулярные%20выражения%20и%20автоматы). В 1956 году [Ноам Хомский](https://ru.wikipedia.org/wiki/Хомский,_Ноам) предложил [иерархию формальных грамматик](#Иерархия%20Хомского). В 1959 году [Михаэль Рабин](https://ru.wikipedia.org/wiki/Рабин,_Михаэль) и [Дана Скотт](https://ru.wikipedia.org/wiki/Скотт,_Дана) дали [строгое определение НКА](#ДКА%20и%20НКА), а также доказали его эквивалентность с ДКА.
|
||||
В самом начале, в 1943 году, [Уоррен Маккаллок](https://ru.wikipedia.org/wiki/Мак-Каллок,_Уоррен) и [Уолтер Питтс](https://ru.wikipedia.org/wiki/Питтс,_Уолтер) создали [формальную модель нейрона](https://ru.wikipedia.org/wiki/Искусственный_нейрон), которая по своей сути является переключательным автоматом. В 1950-ых годах [Стивен Клини](https://ru.wikipedia.org/wiki/Клини,_Стивен_Коул) вывел [[#Регулярные выражения и автоматы|связь регулярных выражений и конечных автоматов]]. В 1956 году [Ноам Хомский](https://ru.wikipedia.org/wiki/Хомский,_Ноам) предложил [[#Иерархия Хомского|иерархию формальных грамматик]]. В 1959 году [Михаэль Рабин](https://ru.wikipedia.org/wiki/Рабин,_Михаэль) и [Дана Скотт](https://ru.wikipedia.org/wiki/Скотт,_Дана) дали [[#ДКА и НКА|строгое определение НКА]], а также доказали его эквивалентность с ДКА.
|
||||
### Иерархия Хомского
|
||||
|
||||
В своей теории Хомский делит грамматику языка на четыре типа - от 3 до 0. Чем ниже номер типа, тем мощнее грамматика и тем сложнее устройство, нужное для распознавания.
|
||||
|
||||
Тип 3 - **регулярные** грамматики. Примерами языка с такой грамматикой будут являться различные идентификаторы или числа. Для распознавания такой грамматики в основном используется [конечный автомат](#Конечный%20автомат).
|
||||
Тип 3 - **регулярные** грамматики. Примерами языка с такой грамматикой будут являться различные идентификаторы или числа. Для распознавания такой грамматики в основном используется [[#Конечный автомат|конечный автомат]].
|
||||
|
||||
Тип 2 - **контекстно-свободные** грамматики. Примером языка с такой грамматикой может быть синтаксис любого языка программирования. Для распознавания такой грамматики используется [автомат с магазинной памятью](https://ru.wikipedia.org/wiki/Автомат_с_магазинной_памятью).
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
|
||||
Строка принимается автоматом, если, начав в $q_0$ и применяя $\delta$ символ за символом, автомат оказывается в одном из состояний $F$.
|
||||
|
||||
Такие автоматы можно встретить в лексическом анализе (разбивает текст программы на токены), сетевых протоколах (разбирает TCP-состояние, парсит [HTTP-заголовки](../Веб-программирование/Общие%20стандарты%20и%20протоколы%20сети%20Интернет.md#Заголовки%20HTTP)), играх (поведение NPC), [регулярных выражениях](#Регулярные%20выражения%20и%20автоматы) и схемотехнике (сам по себе конечный автомат является стандартной моделью цифровых схем управления).
|
||||
Такие автоматы можно встретить в лексическом анализе (разбивает текст программы на токены), сетевых протоколах (разбирает TCP-состояние, парсит [HTTP-заголовки](../Веб-программирование/Общие%20стандарты%20и%20протоколы%20сети%20Интернет.md#Заголовки%20HTTP)), играх (поведение NPC), [[#Регулярные выражения и автоматы|регулярных выражениях]] и схемотехнике (сам по себе конечный автомат является стандартной моделью цифровых схем управления).
|
||||
#### ДКА и НКА
|
||||
|
||||
>**Детерминированный конечный автомат** (ДКА) - конечный автомат, в котором существует ровно один возможный переход из определенного состояния по данному символу.
|
||||
@@ -153,7 +153,7 @@
|
||||
Именно по такому алгоритму работает большинство движков для регулярных выражений в стандартных библиотеках языков программирования.
|
||||
#### Минимизация
|
||||
|
||||
[Построение Томпсона](#Построение%20Томпсона) очень хорошо работает для построения автомата, но обычно дает автомат с избыточным числом состояний. Именно поэтому существуют методы минимизации полученного конечного автомата.
|
||||
[[#Построение Томпсона]] очень хорошо работает для построения автомата, но обычно дает автомат с избыточным числом состояний. Именно поэтому существуют методы минимизации полученного конечного автомата.
|
||||
|
||||
>**Теорема Майхилла-Нероуда** - для каждого регулярного языка существует единственный минимальный ДКА.
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
|
||||
Формально такую ограниченность конечных автоматов можно доказать через [лемму о накачке](https://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages).
|
||||
|
||||
Почти в любом языке программирования синтаксис представляет собой [контекстно-свободный, а не регулярный](#Иерархия%20Хомского) язык. Поэтому лексер (конечный автомат) сам по себе не может разобрать структуру программы целиком, для этого ему нужен парсер с дополнительной памятью (стеком).
|
||||
Почти в любом языке программирования синтаксис представляет собой [[#Иерархия Хомского|контекстно-свободный, а не регулярный]] язык. Поэтому лексер (конечный автомат) сам по себе не может разобрать структуру программы целиком, для этого ему нужен парсер с дополнительной памятью (стеком).
|
||||
#### Формы представления конечного автомата
|
||||
|
||||
Конечный автомат можно описать в виде пять разных форм.
|
||||
|
||||
Reference in New Issue
Block a user