
- •Теоретические основы формальных языков и их трансляции (магистратура)
- •1. Грамматики и языки.
- •1.1. Обсуждение грамматик.
- •1.2. Символы и цепочки.
- •1.3. Формальное определение грамматики и языка.
- •1.4. Синтаксические деревья и неоднозначность.
- •1.5. Задача разбора.
- •1.6. Некоторые отношения применительно к грамматикам.
- •1.7. Практические ограничения, налагаемые на грамматики.
- •1.9. Некоторые проблемы теории формальных языков.
- •2. Регулярные выражения и конечные автоматы.
- •2.1. Диаграммы состояний.
- •2.2. Детерминированный конечный автомат.
- •2.4. Построение ка из нка.
- •3. Нисходящие распознаватели.
- •3.1. Нисходящий разбор с возвратами.
- •3.2. Проблемы нисходящего разбора и их решение.
- •5.3. Лексический анализ.
- •5.4. Синтаксический анализ.
- •5.5. Генерация кода.
- •5.6. Оптимизация кода.
- •5.7. Анализ и исправление ошибок.
- •5.8. Принципиальная модель компилятора.
- •1.1. Обсуждение грамматик
1.2. Символы и цепочки.
Мы неформально определяем язык как подмножество множества всех предложений из "слов" или символов некоторого основного словаря. И опять - таки нас не интересует смысл этих предложений. Например, английский язык состоит из предложений, которые являются последовательностями, составленными из слов (if, he, is и т.д.), и знаков пунктуации (запятые, точки, скобки). Язык программирования ПАСКАЛЬ состоит из программ, которые являются последовательностями, составленными из таких символов, как if, begin, end, знаков пунктуации, букв и цифр. Язык четных целых чисел состоит из последовательностей, составленных из цифр 0,1,...9, в которых последней цифрой должны быть 0,2,4,6 или 8.
О п р е д е л е н и е 1.1. АЛФАВИТ - это непустое конечное множество элементов. Назовем элементы алфавита символами. Всякая конечная последовательность символов алфавита А называется цепочкой. Вот несколько цепочек "в алфавите" А={a,b,c}:a,b,c,ab,aaca. Мы также допускаем существование пустой цепочки , т.е. цепочки, не содержащей ни одного символа. Важен порядок символов в цепочке; так, цепочка ab не то же самое, что ba, и abca отличается от aabc. Длина цепочки х (записывается как |х|) равна числу символов в цепочке. Таким образом,
||=0, |а|=1. |abb|=3.
Заглавные буквы M,N,S,T,U,... используются как переменные или имена символов алфавита, в то время как строчные буквы t,u,v,w... используются для обозначения цепочек символов. Таким образом, можно написать
х=STV,
и это означает, что х является цепочкой, состоящей из символов S,T и V именно в таком порядке. Если х и у-цепочки, то их конкатенацией ху является, полученная путем дописывания символов цепочки у вслед за символами цепочки х. Например, если х=XY, у=YZ, то ху=XYYZ и ух=YZXY. Поскольку - цепочка, не содержащая символов, в соответствии с правилом катенации для любой цепочки х мы можем написать
х=х=х.
Если z=ху - цепочка, то х - голова, а у - хвост цепочки z. И, наконец, х- правильная голова, если у - не пустая цепочка. Таким образом, если х=abc, то ,a,ab и abc суть головы х, и к тому же все они, кроме abc, - правильные головы.
Множества цепочек в алфавите обычно обозначаются заглавными буквами А,В,... . Произведение АВ двух множеств в цепочке А и В определяется как
АВ={ху|хА, а уВ}
и читается как "множество цепочек ху, такое, что х из А, а у из В". Например, если А={a,b} и B={c,d}, то множество AB={ac,ad,bc,bd}. Поскольку х=х=х справедливо для любой цепочки х, мы имеем
{}A=A{}=A.
Заметьте, что здесь символ заключен в фигурные скобки. Произведение определено для множеств, тогда как является символом, а не множеством. {}-это множество, состоящее из пустого символа .
Мы
можем теперь определить степени цепочек.
Если x1=x,
x2=xx,
x3=xxx
,
и в общем случае xn
определяется как х - цепочка, то х0
- пустая цепочка ,
Для n>0 имеем xn=xxn-1=(xn-1)x.
Так же можно определить степени алфавита А:
A0={}, A1=A, An=AAn-1 для n>0.
Используя это, определим две последние операции в этом разделе - итерацию А* множества А и усеченную итерацию А+ множества А:
А+=А1 А2 ... Аn ...,
А*=А0 А+.
Таким образом, если А={a,b}, то А* включает цепочки
,a,b,aa,ab,bb,aaa,aab... .
Заметим, что А+=АА* =(А*)А.
П р и м е р 1.1.:
Пусть z=abb. Тогда |z|=3. Головы z есть ,a,ab,abb. Правильные головы z есть ,a,ab. Хвосты z - это ,b,bb,abb. Правильные хвосты z - это ,b,bb.
Пусть х=а, z=abb.Тогда
zx=abba, xz=aabb,
z0=, z1=abb, z2=abbabb, z3=abbabbabb,
|z0|=0, |z1|=3, |z2|=6,|z3|=9.
Пусть S={a,b,c}. Тогда
S+={a,b,c,aa,ab,bb,bc,ca,cb,cc,aaa,...}.
S*={,a,b,c,aa,ab,ac,...}.
Иногда удобнее и, как правило, нагляднее писать х... вместо ху,
если нас не интересует у - остальная часть цепочки. Таким образом, три точки "..." обозначают любую возможную цепочку, включая и пустую. Наиболее часто встречаются следующие обозначения:
Обозначение Смысл
z=х... х - голова цепочки z. Нам безразличен хвост.
z=...х х - хвост цепочки z. Нам безразлична голова.
z=...х... х встречается где-то в цепочке z.
z=S... Символ S - первый символ цепочки z.
z=...S Символ S - последний символ цепочки z.
z=...S... Символ S встречается где-то в цепочке z.