В.А. Серебряков - Теория и реализация языков программирования (1114953), страница 7
Текст из файла (страница 7)
. . An , i)|−M (p, A1 , A2 . . . Ai−1 AAi+1 . . . An , i − 1).Если (p, A, R) ∈ D(q , Ai ) и i < n, то будем говорить, что(q , A1 , A2 , . . . , An , i)|−M (p, A1 , A2 . . . Ai−1 AAi+1 . . . An , i + 1),т. е. M печатает A поверх Ai , меняет состояние на p и передвигает головкувлево или вправо, но не за пределы области, в которой символы располагались исходно. Как обычно, определим отношение |−∗M как(q , α, i)|−∗M (q , α, i);если(q1 , α1 , i1 )|−∗M (q2 , α2 , i2 )и(q2 , α2 , i2 )|− ∗ (q3 , α3 , i3 ),то(q1 , α1 , i1 )|−∗M (q3 , α3 , i3 ).c , $ } )∗Язык, допускаемый M , — это {w | w ∈ (Σ \ { °cи (q0 , °w$, 1)|−∗M (q , α, i) для некоторого q ∈ F , α ∈ Γ∗ и целого i}.Будем называть M детерминированным, если D(q , A) содержит не болееодного элемента для любых q ∈ Q, A ∈ Γ.
Неизвестно, совпадают ли классымножеств, допускаемых детерминированными и недетеминированными ЛОА.Ясно, что любое множество, допускаемое недетерминированным ЛОА, допускается некоторой детерминированной МТ (машиной Тьюринга). Однако числоячеек ленты, требуемой этой МТ, может экспоненциально зависеть от длинывхода.2.6. Связь линейно ограниченных автоматов и КЗ-языков29Класс множеств, допускаемых ЛОА, в точности совпадает с классомконтекстно-зависимых языков.Теорема 2.7.
Если L — контекстно-зависимый язык, то L допускается ЛОА.Д о к а з а т е л ь с т в о . Пусть G = (VN , VT , P , S) — контекстнозависимая грамматика. Построим ЛОА M , допускающий язык L(G). Не вдаваясь в детали построения M , поскольку он довольно сложен, рассмотримсхему его работы. В качестве ленточных символов будем рассматриватьпары (s1i , s2i ), где s1i ∈ Σ, Σ = VT ∪ {@, $}, s2i ∈ Γ, Γ = VT ∪ VN ∪ {B}.В начальной конфигурации лента содержит (@, B), (a1 , B), . .
. (an , B), ($, B),где a1 , . . ., an = w — входная цепочка, n = |w|. Цепочку символов s11 , . . ., s1nбудем называть первым треком, s21 , . . ., s2n — вторым треком. Первый трекбудет содержать входную строку x с концевыми маркерами. Второй трекбудет использоваться для вычислений. На первом шаге M помещает символS в самую левую ячейку второго трека.
Затем M выполняет процедуругенерации в соответствии со следующими шагами.1. Процедура выбирает подстроку символов α из второго трека, такую, чтоα → β ∈ P.2. Процедура заменяет подстроку α на β , перемещая, если необходимо,вправо символы справа от α. Если эта операция могла бы привестик перемещению символа за правый концевой маркер, то ЛОА останавливается.3. Процедура недетерминированно выбирает, перейти на шаг 1 или завершиться.На выходе из процедуры первый трек все еще содержит строку x, а второйтрек содержит строку γ , такую, что S ⇒ ∗G γ.
ЛОА сравнивает символыпервого трека с соответствующими символами второго трека. Если сравнениенеуспешно, то строки символов первого и второго треков неодинаковы и ЛОАостанавливается без допуска. Если строки одинаковы, то ЛОА останавливается и допускает.Если x ∈ L(G), то существует некоторая последовательность шагов, на которой ЛОА строит x на втором треке и допускает вход. Аналогично, для того,чтобы ЛОА допустил x, должна существовать последовательность шагов,такая, что x может быть построен на втором треке. Таким образом, долженбыть вывод x из S в G.Отметим схожесть этих рассуждений и рассуждений в случае произвольной грамматики. Тогда промежуточные сентенциальные формы могли иметьдлину, произвольно большую по сравнению с длиной входа.
Как следствие,требовалась вся мощь машин Тьюринга. В случае контекстно-зависимых30Глава 2. Языки и их представлениеграмматик промежуточные сентенциальные формы не могут быть длиннеевхода.Теорема 2.8. Если L допускается ЛОА, то L — контекстно-зависимыйязык.Д о к а з а т е л ь с т в о . Конструкция КЗГ по ЛОА аналогична конструкции грамматики типа 0, моделирующей машину Тьюринга. Различие заключатся в том, что нетерминалы КЗГ должны указывать не только текущееи исходное содержимое ячеек ленты ЛОА, но и то, является ли ячейкасоседней справа или слева с концевым маркером.
Кроме того, состояние ЛОАдолжно комбинироваться с символом под головкой, поскольку КЗГ не можетиметь раздельные символы для концевых маркеров и состояния ЛОА, так какэти символы должны были бы быть заменены на e, когда строка превращаетсяв терминальную.1-я группа правил — моделирование начальной конфигурации вида(q0 , @w#, 1), |w| > 1:A1 → [q0 , @, a.a]A2 ;A2 → [a.a]A2 ;A2 → [a.a, #].2-я группа правил — моделирование движения на левом конце цепочки приq ∈ F:[q , @, X , a] → [@, p, X , a], если (p, @, R) ∈ D(q , @);[@, q , X , a] → [p, @, Y , a], если (p, Y , L) ∈ D(q , X);[@, q , X , a][Z , b] → [@, Y , a][p, Z , b], если (p, Y , R) ∈ D(q , X).3-я группа правил — моделирование движения в середине цепочки приq ∈ F:[q , X , a][Z , b] → [Y , a][p, Z , b], если (p, Y , R) ∈ D(q , X);[Z , b][q , X , a] → [p, Z , b][Y , a], если (p, Y , L) ∈ D(q , X).[q , X , a][Z , b, #] → [Y , a][p, Z , b, #], если (p, Y , R) ∈ D(q , X).4-я группа правил — моделирование движения на правом конце цепочкипри q ∈ F :[q , X , a, #] → [Y , a, p, #], если (p, Y , R) ∈ D(q , X);[X , a, q , #] → [p, X , a, #], если (p, #, L) ∈ D(q , #);[Z , b][q , X , a, #] → [p, Z , b][Y , a, #], если (p, Y , L) ∈ D(q , X).5-я группа правил — восстановление входного символа в состоянии q ∈ F :на левом конце цепочки[q , #, a, X] → a, [@, q , X , a] → a;в середине цепочки[q , X , a] → a;на правом конце цепочки[q , X , a, #] → a, [X , a, q , #] → a.2.6.
Связь линейно ограниченных автоматов и КЗ-языков316-я группа правил — восстановление входной цепочки слева-направо:a[x, b] → ab,a[x, b, #] → ab.7-я группа правил — восстановление входной цепочки справа-налево:[x, a]b → ab,[@, x, a]b → ab.Отдельно для односимвольных цепочек — моделирование начальной конфигурации вида (q0 , @, a, #, 1):A1 → [q0 , @, a, a, #].Если q ∈ F :[q , @, X , a, #] → [@, p, X , a, #], если (p, @, R) ∈ D(q , @);[@, q , X , a, #] → [p, @, Y , a, #], если (p, Y , L) ∈ D(q , X);[@, q , X , a, $] → [@, Y , a, p, #], если (p, Y , R) ∈ D(q , X);[@, X , a, q , #] → [@, p, X , a, #], если (p, $, L) ∈ D(q , $).Если q ∈ F :[q , @, X , a, #] → a;[@, q , X , a, #] → a;[@, X , a, q , #] → a.Теорема 2.9.
Существуют рекурсивные множества, не являющиесяконтекстно-зависимыми.Д о к а з а т е л ь с т в о . Все строки в {0, 1}∗ можно занумеровать. Пустьxi — i-е слово. Мы можем занумеровать все грамматики типа 0, терминальными символами которых являются 0 и 1.
Поскольку имена переменных неважны и каждая грамматика имеет конечное их число, можно предположить,что существует счетное число переменных.Представим переменные в двоичной кодировке как 01, 011, 0111, 01111и т. д. Предположим, что 01 всегда является стартовым символом. Крометого, в этой кодировке терминал 0 будет представляться как 00, а терминал1 как 001. Символ «→» представляется как 0011, а запятая как 00111.Любая грамматика с терминалами 0 и 1 может быть представлена строкойправил, использующей стрелку (0011) для разделения левой и правой частей,и запятой (00111) для разделения правил.
Строки, представляющие символы,используемые в правилах, — это 00, 001 и 01i для i = 1, 2, . . .. Множествоиспользуемых переменных определяется неявно правилами.Отметим, что не все строки из 0 и 1 представляют грамматики, причем не обязательно КЗГ. Однако по данной строке легко можно сказать,представляет ли она КЗГ. i-ю грамматику можно найти, генерируя двоичныестроки в описанном порядке, пока не сгенерируется i-я строка, являющаясяКЗГ. Поскольку имеется бесконечное число КЗГ, их можно занумероватьв некотором порядке G1 , G2 , . .
..32Глава 2. Языки и их представлениеОпределим L = {xi |xi ∈/ L(Gi )}. Ясно, что L рекурсивно. По строке xiлегко можно определить i и затем определить Gi . По теореме 2.6 имеется алгоритм, определяющий для xi , принадлежит ли она L(Gi ), посколькуGi — КЗГ. Таким образом, имеется алгоритм, определяющий для любой x,принадлежит ли она G.Покажем теперь, что L не генерируется никакой КЗ-грамматикой. Допустим, что L генерируется КЗ-грамматикой Gi . Сначала предположим,что xi ∈ L. Поскольку L(Gi ) = L, xi ∈ L(Gi ). Но тогда по определениюxi ∈/ L(Gi ) — противоречие. Таким образом, предположим, что xi ∈/ L.
Поскольку L(Gi ) = L, xi ∈/ L(Gi ). Но тогда по определению xi ∈ L(Gi ) — сновапротиворечие. Из этого можно заключить, что L не генерируется Gi . Поскольку приведенный выше аргумент справедлив для каждой КЗ-грамматикиGi в перечислении и поскольку перечисление содержит все КЗ-грамматики,можно заключить, что L — не КЗ-язык. Поэтому L — рекурсивное множество,не являющееся контекстно-зависимым.Глава 3ЛЕКСИЧЕСКИЙ АНАЛИЗОсновная задача лексического анализа — разбить входной текст, состоящий из последовательности одиночных символов, на последовательностьслов, или лексем, т. е. выделить эти слова из непрерывной последовательностисимволов.
Все символы входной последовательности с этой точки зренияразделяются на символы, принадлежащие каким-либо лексемам, и символы,разделяющие лексемы (разделители). В некоторых случаях между лексемамиможет и не быть разделителей. С другой стороны, в некоторых языкахлексемы могут содержать незначащие символы (например, символ пробелав Фортране). В Си разделительное значение символов-разделителей можетблокироваться («\» в конце строки внутри «. . .»).Обычно все лексемы делятся на классы. Примерами таких классов являются числа (целые, восьмеричные, шестнадцатеричные, действительныеи т. п.), идентификаторы, строки.
Отдельно выделяются ключевые словаи символы пунктуации (иногда их называют символами-ограничителями).Как правило, ключевые слова — это некоторое конечное подмножество идентификаторов. В некоторых языках (например, ПЛ/1) смысл лексемы можетзависеть от ее контекста и невозможно провести лексический анализ в отрывеот синтаксического.Для осуществления двух дальнейших фаз анализа лексический анализатор (ЛА) выдает информацию двух типов: для синтаксического анализатора,работающего вслед за лексическим, существенна информация о последовательности классов лексем, ограничителей и ключевых слов, а для контекстного анализатора, работающего вслед за синтаксическим, существеннаинформация о конкретных значениях отдельных лексем (идентификаторов,чисел и т.