Теория языков программирования и методы трансляции Тема №2 Определение языка Вопросы Методы определения бесконечного набора строк. Понятие грамматики для определения языков программирования. Иерархия грамматик. Выведение предложений языка из грамматики Неоднозначные грамматики Определение языка должно быть точным (или формальным); лаконичным; машинно-читаемым. Несколько очень простых языков 1.{ xn |n 0} xxxx 2.{ xn y n |n 0} xy xxxyyy xxxxxyyyyy 3.{ xn y m |n, m 0} xyyy xxyyyy Несколько очень простых языков 4.{ xn y m |n, m 0} xxxx yyyyyyy ε - пустая строка Регулярные выражения Рассмотренные языки можно также определить с помощью регулярных выражений, подобных приведенному ниже. * * x y * - звездочка (замыкание) Клини. Если в каждой строке языка должно находиться минимум по одному элементу х и у, то язык можно определить следующим образом. * * x y xx yy или альтернативно Регулярные выражения В регулярных выражениях можно использовать символ "|" (читается как "или"). Таким образом, выражение * x |y * представляет запись языка, стоки которого состоят из нуля или большего количества элементов х или из нуля или большего количества элементов у. Регулярные выражения Чтобы более формально определить понятие регулярного выражения, введем вначале понятие алфавита. Алфавит представляет собой конечный набор символов, подобный приведенным ниже. {0,1} {α..ω} {0..9} Регулярные выражения Если А — алфавит, то к числу регулярных выражений относятся: нулевая строка (обозначается ε); любой элемента А. Кроме того, если Р и Q являются регулярными выражениями, то регулярными являются также следующие выражения. PQ (Q следует после Р) P|Q (Р или Q) Р* (нуль или более вхождений Р) + - не является оператором регулярных выражений. Регулярные выражения (примеры) * * ( a | b) * a|b * I (I | d ) (aab | ab) * * * * (d d .d ) | (d .dd ) КА и регулярные выражения α * α|β αβ Грамматики Язык {xn yn |n 0} невозможно определить посредством регулярного выражения, поскольку в регулярных выражениях не существует возможности указать, что количество элементов х должно равняться количеству элементов у. Решение – использование продукций как нижеследующие S xSy S xy - «имеет вид» или «может иметь вид» Грамматики Продукции могут использоваться для генерации строк языка с использованием следующих правил. 1. Начать с символа S и заменить его строкой, расположенной справа от знака, продукции. 2. Если полученная строка не содержит больше символов S, она является строкой языка. В противном случае следует снова заменить S строкой после знака продукции, а затем снова вернуться к п. 2. Грамматики Последовательность строк S xSy xxSyy xxxyyy можно заменить на S xSy xxSyy xxxyyy - читается как «порождает» Последовательность шагов, использованная для генерации строки с применением продукций грамматики, называется порождением (derivation) строки. Грамматики Грамматика определяется как следующая четверка чисел (VT ,VN , P, S ) VT — алфавит, символы которого называют терминальными символами, или терминалами. VN — алфавит с нетерминальными символами, или нетерминалами.VT и VN не имеют общих символов (т.е. VT VN ) V VT VN Р — множество продукций (или правил), каждый элемент которого состоит из пары α, β , где α — левая часть продукции, β — правая часть продукции, а сама продукция записывается следующим образом. α β Грамматики α V (строки, состоящие из одного или более символов V ), а β V * (строки, состоящие из нуля илиболее символов V ). S VN , называется символом предложения, или аксиомой грамматики, и с него начинается генерация любой строки языка. Грамматики Грамматика используется для генерации последовательностей символов, составляющих строки языка, начиная с аксиомы и последовательно заменяя ее (или нетерминалы, которые появятся позднее) с помощью одного из порождений грамматики. На каждом этапе к нетерминалу из левой части применяется продукция, заменяющая этот нетерминал последовательностью символов своей правой части. Процесс прекращается после получения строки, состоящей только из терминальных символов (т.е. не содержащей нетерминалов). Языку принадлежат те, и только те строки символов, которые можно получить с помощью заданной грамматики. Грамматики Например, грамматикой для языка {xn yn |n 0} будет грамматика G1 ({x, y},{S}, P, S ) где P {S xSy,S xy} грамматикой для языка {xn y m |n, m 0} будет грамматика G2 ({x, y},{S , B}, P, S ) где P {S xS ,S yB,S x,S y,B yB,B y,S ε} Грамматики Рассмотрим порождение строки xxyyy S xS xxS xxyB xxyyB xxyyy Каждая из строк, фигурирующих в порождении, называется сентенциальной формой, а последняя строка (состоящая только из терминалов) называется предложением языка. Использование символа "=>" между двумя сентенциальными формами обозначает, что строка справа от этого символа получена из строки слева от него посредством одного порождения. В то же время можно записать * xxyyy S S xxyyy Грамматики Условимся, что последовательность продукций (порождения) B yB B y можно записать в сжатой форме B yB | y Грамматики Необходимо отметить, что для генерации конкретного языка обычно не существует единственной грамматики. На тривиальном уровне любой нетерминал можно заменить еще неиспользованным символом. Можно произвести более значительные изменения: изменить форму и количество продукций. Рассмотрим следующий язык. {xn ym |n, m 0} Данный язык можно сгенерировать, используя такой набор продукций. P {S XY , X xX , X ε, Y yY , Y ε} Этот набор отличается от приведенного ранее для того же языка. Две грамматики генерирующие один и тот же язык называются эквивалентными. Иногда при создании компилятора оказывается полезным или даже необходимым заменить данную грамматику эквивалентной. Грамматики Данное определение грамматики допускает грамматики более общих типов чем те, что были приведены в качестве примеров. Например, левая часть продукции не обязательно должна состоять из одного символа. Рассмотрим следующую грамматику. G3 ({a},{S , N , Q, R}, P, S ) где P {S QNQ,QN QR, RN NNR,RQ NNQ, N a,Q ε} Продукции называются контекстно-зависимыми. Типичные порождения для данной грамматики могут иметь вид aa S QNQ QRQ QNNQ aaaa S QNQ QRQ QNNQ QRNQ QNNRQ QNNNNQ Иерархия грамматик Хомский определил четыре класса грамматик: 1. 0-го типа или рекурсивно-перечеслимые, определяются как все грамматики, которые соответствуют данному выше определению без ограничений на типы продукций. Грамматики 0-го типа эквивалентны машинам Тьюринга в том смысле, что для любой данной грамматики 0-го типа существует машина Тьюринга, которая допускает, и только допускает, все предложения, сгенерированные данной грамматикой. И наоборот, для данной машины Тьюринга существует грамматика 0го типа, которая генерирует точно все предложения, допускаемые машиной Тьюринга. 2. 1-го типа или конткстно-зависимые. Определяются наложением следующего ограничения на продукции грамматики 0-го типа. Для всех продукций вида α β выполняется условие, что αβ Если обратиться к теории автоматов, грамматики 1-го типа эквивалентны линейно ограниченным автоматам в том же смысле, как грамматики 0-го типа эквивалентны машинам Тьюринга. Иерархия грамматик 3. 2-го типа или контектсно-свободная, определяется наложением следующего ограничения на грамматику 1-го типа. В левой части продукции должен находиться только один нетерминал Грамматики 2-го типа эквивалентны магазинным автоматам. 4. 3-го типа или регулярные грамматики – праволинейные или леволинейные грамматики Праволинейная грамматика – если в правой части продукции грамматики присутствует нетерминал, то он должен находится только справа от терминала Леволинейная грамматика - если в правой части продукции грамматики присутствует нетерминал, то он должен находится только слева от терминала. В грамматики 2-го и 3-го типа полезно добавить продукцию вида S ε Иерархия грамматик Любой язык, определенный любым регулярным выражением, можно сгенерировать регулярной грамматикой (отсюда и название регулярный). Регулярные языки и регулярные выражения эквивалентны конечным автоматам. Таким образом, имеем трехстороннюю эквивалентность между регулярными выражениями, регулярными языками и конечными автоматами. Иерархия грамматик Грамматики Продукции A Ab B cB C dCf содержат прямую рекурсию, левую, правую и среднюю соответственно. Непрямая рекурсия A Bc B Cd C Ae Грамматика В тех немногих случаях, когда грамматика не содержит рекурсии, язык является конечным, следовательно, регулярным, поскольку можно просто перечислить все предложения языка. Любой конечный набор строк можно представить регулярной грамматикой. Чрезвычайно полезным является утверждение (приводим без доказательства): "Если грамматика не содержит средней рекурсии (такую грамматику также называют самовложенной),то генерируемый ею язык является регулярным". Регулярные грамматики (3-го типа) почти всегда можно использовать в качестве основы лексического анализа. а контекстно-свободные грамматики (2-го типа), в основном, необходимы для синтаксичекого анализа. Грамматики. Порождения. Порождение предложения xxxxyyyy для языка {x n y n | n 0} S xSy xxSyy xxxSyyy xxxxyyyy является единственным, генерирующим данное конкретное предложение. Впрочем, в общем случае порождения не являются уникальными. n m Например следующий язык {x y | n, m 0} Предложения которого генерируются следующими продукциями S XY X xX X x Y yY Yy Предложение xxxyy может быть сгенерировано порождениями S XY xXY xxXY xxxY xxxyY xxxyy S XY XyY Xyy xXyy xxXyy xxxyy Грамматики. Порождения. Если на каждом шаге порождения заменяется крайний левый нетерминал сентенциальной формы, такое порождение называется левым (leftmost). Соответсвенно второе из рассмотренных порождений называется правым (rightmost). Существуют порождения, которые не являются ни левыми, ни правыми. S XY xXY xXyY xxXyY xxXyy xxxyy Стоит обратить внимание, что в регулярных грамматиках для каждой строки существует единственное порождение. Прежде всего это связано с тем, что в сентенциальной форме имеется не более одного нетерминала. Грамматики. Порождения. Порождение можно описать с помощью синтаксического дерева (или дерева синтаксического разбора). S XY xXY xXyY xxXyY xxXyy xxxyy Грамматики. Неоднозначность. Для многих грамматик любому предложению, которое можно сгенерировать, соответствует единственное синтаксическое дерево, а также единственное правое или левое порождение. Фактически, эти три условия эквивалентны: из любого из них следуют два других. Иными словами, если одно из следующих утверждений справедливо, то справедливы и остальные. •Каждое сгенерированное грамматикой предложение имеет единственное левое порождение. •Каждое сгенерированное грамматикой предложение имеет единственное правое порождение. •Каждое сгенерированное грамматикой предложение имеет единственное синтаксическое дерево. Грамматики. Неоднозначность. Грамматики, для которых справедливы вышеуказанные утверждения, называются однозначными (unambiguous). В противном случае грамматика является неоднозначной (ambiguous). Если все грамматики, генерирующие язык, являются неоднозначными, язык также называют неоднозначным. S S S Sx S S S xS xS S xxS xxx S S S S S S xS S xxS xxx Грамматики. Неоднозначность. Грамматики. Неоднозначность. Известна неоднозначная грамматика языка. Существует ли однозначная грамматика для генерации того же языка? Существуют ли алгоритмы, используя которые можно определить, является ли данная грамматика или язык неоднозначными? S Sx Sx S S xS xxxxx Проблема однозначности языка еще не разрешена, т.е. из теоретических рассуждений известно, что не существует общего решения данной задачи. Грамматики. Неоднозначность. Итак, существуют две родственные неразрешимые задачи, касающиеся неоднозначности в языках, а именно: •задача определения, является ли грамматика неоднозначной; •задача определения, является ли неоднозначным язык. Хотя в общем случае задача не решена, существует один класс грамматик, для которых известно, что элементы являются неоднозначными, т.е. существуют продукции, характеризующиеся одновременно правой и левой рекурсией. Таким образом, рассмотренная выше грамматика с продукцией S S S является неоднозначной. Обратное утверждение неверно, т.е. грамматики, не содержащие правой и левой рекурсии, не обязательно являются однозначными (иначе у нас был бы простой критерий однозначности). Грамматики. Неоднозначность. statment if expr then statment else statment | if expr then statment | other if expr then if expr then other else other Грамматики. Неоднозначность. statment matched | unmatched matched if expr then matched else matched | other unmatched if expr then statment | if expr then matched else unmatched