- •Учебное пособие
- •Учебное пособие
- •Оглавление
- •2. 2 Регулярные выражения
- •2. 3 Грамматика
- •2. 4 Способы получения одних цепочек символов из других
- •2. 5 Формальное определение языка
- •2. 6 Расширенные грамматики
- •2. 7 Задачи анализа
- •2. 8 Синтаксические диаграммы
- •2. 9 Введение в компиляцию
- •2. 30 Структура компилятора
- •2. 11 Проходы компилятора
- •3 Алгоритмический язык spl
- •3. 4 Символы
- •3. 4 Оператор цикла
- •4 Лексический анализ
- •4. 5 Блок-схема функции void main (int ac, char * av [ ])
- •4. 5 Блок-схема функции void number ()
- •4. 5 Блок-схема функции void word ()
- •4. 5 Блок-схема функции char*add(char*nm)
- •5 Полный синтаксис языка spl
- •5.6Алфавит нетерминальных символов
- •5. 6 Синтаксические диаграммы и функции распознавания цепочек для нетерминальных символов
- •6 Пояснения к выполнению курсовой работы
- •6. 7 Пример выполнения курсовой работы
- •6. 7 Варианты заданий для курсовой работы
- •6. 7 Требования к оформлению курсовой работы
- •7 Вопросы к экзамену
- •8 Список литературы
- •Учебное пособие
2. 2 Регулярные выражения
Это цепочки символов, в которые входят не только символы из некоторого алфавита I, но и другие символы, которые часто носят служебный характер. Например, это могут быть запятая для разделения других символов, а также символы для обозначения каких-либо действий над цепочками. Пусть множество {,* } из перечисленных в фигурных скобках символов не входит в алфавит I. Тогда цепочка символов из объединения IU{,* } называется регулярным выражением. Эти выражения обычно используются для описания синтаксиса какого-либо алгоритмического языка.
2. 3 Грамматика
Грамматика G=(T,N,P,S),
где T - алфавит т.н. терминальных символов. Это символы, которые заведомо определены. Например, это символы, используемые в каком-либо алгоритмическом языке. Какие это символы и какое их качество – все это заведомо определено. Только эти символы в дальнейшем используются при написании программ на этом алгоритмическом языке.
N – алфавит т.н. нетерминальных символов. Это символы, которые обычно используются для определения каких-либо понятий. Такими понятиями в алгоритмическом языке, например, являются идентификатор, переменная, константа, выражение, оператор и, в конце концов, программа. Обычно эти понятия перечисляются и обозначаются символами. Эти символы определяются через терминальные символы или, кроме того, через другие нетерминальные символы более низкого уровня. Например, при определении нетерминального символа “программа” используются терминальные символы алгоритмического языка, а также нетерминальные символы “оператор”, “выражение”, “слагаемое” и др.
Множества T и N не пересекаются. Обычно терминальные символы обозначаются строчными буквами, а нетерминальные – заглавными. Р – множество правил вывода для нетерминальных символов. Например, это правила описания переменных, констант, написания выражений, операторов и т.д. S – стартовый (главный) нетерминальный символ. Для алгоритмических языков это обычно нетерминальный символ “программа”.
2. 4 Способы получения одних цепочек символов из других
1 Это можно сделать непосредственно, т.е. за одну операцию. Условное обозначение .
Например, означает, что цепочку символов можно получить из цепочки за одну операцию.
Пример. Есть цепочки и . Здесь, ,, - терминальные символы (обозначены строчными буквами), а А – нетерминальный символ. Пусть среди множества правил Р есть такое: ЄР. То есть нетерминальный символ АЄN можно заменить на терминальный . Таким образом, за одну операцию из можно получить цепочку .
2 Одну цепочку из другой можно получить не за одну операцию. Условное обозначение *.
Например, 0 *n.
Это имеет место или если 0 = n , или существует последовательность непосредственно получаемых цепочек, таких, что 0 1 2 …
n-1 n.
2. 5 Формальное определение языка
Способы получения цепочек символов необходимы, чтобы формально дать определение языка L(G), описываемого заданной грамматикой G. Язык L(G) – это множество цепочек w терминальных (и только терминальных!) символов, выводимых из начального (стартового, главного) нетерминального символа S. L(G)={w|S *w, где w – терминальные цепочки}.
Вертикальная черта после w в выражении означает, что w получены при условии, что они выводятся из S. А звездочка означает, что этот вывод может происходить за произвольное количество операций. При этом используется множество P правил, описанное в грамматике G.
Ниже приводятся примеры грамматики и описываемые ими языки.
Пример 1 G=(T,N,P,S).
T={x,y,w,z} – алфавит терминальных символов. Только эти символы можно использовать.
N={S,A,B} – множество нетерминальных символов, из которых S – главный (стартовый) нетерминальный символ. Именно с него должен начинаться вывод цепочек (слов) в соответствии с множеством правил вывода P.
Р={SAB, Ax, Ay, Bw, Bz}.
Эти правила означают, что S можно заменить на последовательность нетерминальных символов AB. Ax, A y означает, что А можно заменить на x или на y и т.д. Осуществляя эти замены, получаем цепочки w из терминальных символов, составляющих формальный язык L(G).
L(G)={xw, yw, xz, yz}.
Только эти четыре цепочки (слова) и составляют язык, описываемый заданной грамматикой G.