Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

metoda_2013

.pdf
Скачиваний:
54
Добавлен:
03.05.2015
Размер:
6.36 Mб
Скачать

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

Таким образом, при грамматическом разборе предложения языка, зная соответствие очередного рассматриваемого символа предложения грамматическому вхождению (т.е. правилу и позиции в этом правиле) можно определить, какой символ может быть следующим в предложении и соответствующее грамматическое вхождение.

Поэтому можно определить МП-автомат и соответствующую таблицу разбора следующим образом: строки (состояния автомата) - помечаются грамматическими вхождениями а столбцы -символами алфавита V (терминальными и нетерминальными).

Hа пересечении строки грамматического вхождения и столбца допустимого входного символа ставится переход к следующему грамматическому вхождению или, если грамматическое вхождение соответствует последнему символу правила, то в строке ставится свертка.

Q<= Yjграм. вход. тогда и только тогда, когда:

1.существует Zjграм. вход. : найдется такое U::=...QZi и ZiFIST* Yj

2.если Q=S0 то S0FIST* Yj

Алгоритм построения LR(0) таблицы разбора.

Строим таблицу: столбцы соответствуют символам грамматики (Vt,Vn), строки - грамматическим вхождениям. Причем, если грамматические вхождения неразличимы, т.е.

А <= Yj и A <= Yi , то строится одна строка таблицы и помечается (Yi,Yj).

Таблица строится и заполняется соответствующим образом Первая строка таблицы соответствует

а) пустому стеку

260

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

б)началу разбора, т.е. входной символ - это первый возможный символ входной цепочки.

Элементы - это грамматические вхождения. Причем S0 - соответствует входному символу S. Следующие строки таблицы создаются таким образом - для каждого грамматического вхождения взятого из предыдущей строки создается строка помеченная этим грамматическим вхождением.

Элементы строки при построении таблицы заполняются таким образом. Пусть Q - грамматическое вхождение, которым помечена строка, Z - входной символ.

а) если Q не самый правый символ любого правила, то для любого Z, такого что

Q <= Z - клетки строки таблицы заполняются соответствующими грамматическими вхождениями этих символов.

б) если Q - самый правый символ правила L, эта ситуация соответствует свертке по правилу L. Во все клетки строки ставится свертка по правилу L.

ПРЕОБРАЗОВАHИЕ ТАБЛИЦЫ

Строки таблицы пронумеровать и заменить переход по грамматическому вхождению в клетках таблицы номером соответствующей строки.

Если таблица строится по этому алгоритму, то грамматика является LR(0).

Название "LR(0) грамматика" указывает на то, что просмотр предложения происходит слева направо, любую основу можно обнаружить без просмотра входных символов, расположенных правее последнего входного символа основы.

В LR(0)грамматиках свертка помещается во все клетки строки, соответствующей окончанию правила.

261

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

262

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

SLR(1)

Если для грамматики невозможно построить LR(0) таблицу разбора, т.е. некоторые состояния получаются неадекватными, т.к. в строке необходимо разместить и сдвиг и свертку, переходят на следующий шаг, строят SLR(1)-таблицу разбора. SLRанализатор иначе называется анализатор с предварительным просмотром входных символов.

Основная идея SLR – метода состоит в том, чтобы вначале построить на базе грамматик детерминированный конечный автомат для распознавания активных префиксов. Если G – грамматика со стартовым символом S, то G, расширенная грамматика грамматики G, представляет собой G с новым стартовым символом Sи продукцией S -> S. Назначение этой новой стартовой продукции – указать синтаксическому анализатору, когда он должен прекратить разбор и объявить о допущении входной строки. Т.о., допуск строки происходит тогда и только тогда, когда синтаксический анализатор выполняет свертку, соответствующую продукции S’-> S.

Алгоритм построения:

Вход: Расширенная грамматика G’

Выход: Функция action и goto таблицы SLR-Анализа для грамматики G’.

Метод:

Построим С= {I0, I1, …, In} - систему множества LR(0)- пунктов для грамматики G’.

Состояние I строится на основе Ii. Действия синтаксического анализа для состояния i определяется следующим образом:

если [A ->α∙aβ] € Ii и goto(Ii, a) = Ij, то определить action[i, a]

как “перенос j”; здесь а должно быть терминалом.

если [A ->α∙] € Ii, то определить action[i, a] как “свертка A - >α” для всех α из FOLLOW(A); здесь А не должно быть S’.

если [S’-> S ∙] € Ii , то определить action[i, $] как “допуск”. Если по этим правилам генерируются конфликтующие действия, то грамматика на является SLR(1). Алгоритм не в состоянии построить синтаксический анализатор длля нее.

Переходы goto для состояния i и всех нетерминалов А строятся по правилу: если goto(Ii, А) = Ij, то goto(i, А) = j.

Все записи не определенные по правилам (2) и (3), указываются как ошибка.

263

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

Начальное состояние синтаксического анализатора представляет собой состояние, построенное из

множества пунктов, содержащих [S’-> ∙S].

Таблица синтаксического анализа, состоящая из функций goto и action, определяемых алгоритмом, называется SLR(1) – таблицей грамматики G. LR – анализатор, использующий SLR(1) – таблицу грамматики G, называется SLR(1) – анализатором для G, а соответствующая грамматика - SLR(1) – грамматикой.

Рассмотрим пример:

1.real S <idlist>

2.<idlist> <idlist>,<id>

3.<idlist> <id>

4.<id> A | B | C | D

real (1,1) A (4,1) B (4,1) ,(2,2) в скобках показаны правила Строка 5 соответствует неразличимым грамматическим

вхождениям IDLIST1 ,IDLIST2 , в строке должна быть и свертка и сдвиг, поэтому строка 5 соответствует неадекватному состоянию МП-автомата. Алгоритм построения LR(0) таблицы не разрешает эту неадекватность, необходимо дополнительная информация.

Для разрешения конфликта предлагается делать анализ входного символа.

Алгоритм построения таблицы

Элементы строки при построении таблицы заполняются таким образом. Пусть Q - грамматическое вхождение, - которым помечена строка, Z - входной символ.

а) если Q не самый правый символ любого правила для любого Z : Q <= Z - элементы таблицы соответствий входным символом удовлетворяется условием Z FIRST* Y заполняются соответствующими грамматическими вхождениями этих символов (т.е. отмечается номер правила)

б) если Q- самое правое вхождение в правиле <L> , и существует Z : <L>= Z (т.е. существует правило U::=..LZ..), то в соответствующую Z, клетку вставляем элемент свертки по правилу <L>

264

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

LALR(1)

Алгоритм построения:

Определение. Символы следователи - это символы которые могут следовать за левой частью правила при выполнении операций приведения.

Строим символы следователи для всех символов исходя из вывода

A ::= a b c D

.... A e |

e - символ следования для a b c D;

Символы следователи приписываются грамматическим вхождениям. Если состояние имеющие одинаковые грамматические вхождения, но различных следователей, объединены в единое состояние не порождают неадекватных состояний (противоречий) то они называются LALR(1) - LR(1) с предварительным рассмотрением символов.

1. Построить SLR(1) таблицу разбора.

2.Объединить идентичные состояния, если символы-следователи игнорируются, то есть у них одинаковое количество элементов — одинаковые переходы и свертки (одинаковые переходы различаются символами-следователями). Символы-следователи объединенных элементов это объединение символовследователей из исходных состояний.

3. Функции свертки нового LALR(1) состояния это объединение функций свертки исходных состояний.

11. Разбор по LR(1)таблице

LR(1) - Класс контекстно-свободных грамматики, в которых. чтобы разрешить неоднозначность разбора любого куска входного текста, необходимо не более одной предпросмотренной лексемы.

LR(1) грамматика – это грамматика, которая разрешает конфликты LR(0) грамматики. Допустим, у нас есть множество канонических LR(0)-состояний грамматики. Если это множество не содержит конфликтов, то можно применить LR(0)-парсер. Иначе разрешаем возникшие конфликты, рассматривая односимвольную аванцепочку, т.е. строится LR(1) парсер с множеством LR(0)-состояний.

Символы следователи (символы, которые могут следовать за левой частью правила при выполнении операций приведения) приписываются грамматическим вхождениям. Если состояние имеющие одинаковые грамматические вхождения, но различных следователей объединены в единое состояние не порождают

265

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

неадекватных состояний (противоречий), то они называются LALR(1) или LR(1) с предварительным рассмотрением символов.

Рассмотрим пример:

1.S real <idlist>

2.<idlist> <idlist>,<id>

3.<idlist> <id>

4.<id> A | B | C | D

real (1,1) A (4,1) B (4,1) ,(2,2) в скобках показаны правила

Строка 5 соответствует неразличимым грамматическим вхождениям IDLIST1 ,IDLIST2 , в строке должна быть и свертка и сдвиг, поэтому строка 5 соответствует неадекватному состоянию МП-автомата. Алгоритм построения LR(0) таблицы не разрешает эту неадекватность, необходимо дополнительная информация. Для разрешения конфликта предлагается делать анализ входного символа.

Алгоритм построения таблицы в пункте заполнения строк таблицы должен быть изменен.

Элементы строки при построении таблицы заполняются таким образом. Пусть Q - грамматическое вхождение, - которым помечена строка, Z - входной символ.

а) если Q не самый правый символ любого правила для любого Z : Q <= Z - элементы таблицы соответствий входным символом удовлетворяется условием Z FIRST* Y заполняются соответствующими грамматическими вхождениями этих символов (т.е. отмечается номер правила)

б) если Q- самое правое вхождение в правиле <L> , и существует Z : <L>= Z (т.е. существует правило U::=..LZ..), то в соответствующую Z, клетку вставляем элемент свертки по правилу <L>

Если таблица строится по этому алгоритму, то грамматика SLR(1) (простая LR(1) грамматика).

266

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

Алгоритм построения LALR(1)-грамматики.

(1)S T else F;

(2)T E

(3)T i;

(4)F E

(5)E E + i

(6)E i

Попытаемся строить SLR(1) таблицу

Состоян

S

T

F

 

E

els

«;»

«+»

i

«#

ие

 

 

 

 

 

e

 

 

 

»

1

о

T1

 

 

E21,E

 

 

 

i31,i

 

 

к

1

 

 

51

 

 

 

6

 

i31,i6

 

 

 

 

 

 

«+»32.

«+»5

 

 

 

 

 

 

 

 

 

R6

2

 

 

 

 

 

 

 

 

 

 

 

 

 

В строке (i31,i6)

в столбце («;») получаем неадекватность,

конфликт свертка – сдвиг.

Необходима дополнительная информация, для решения конфликта.

Строим символы следователи для всех символов исходя из вывода

A ::= a b c D

.... A e |

e - символ следования для a b c D; Рассмотрим предыдущий пример:

(3)S T else F;

(4)T E

(3)T i;

(4)F E

(5)E E + i

(7)E i

ПЕРЕХОДЫ И СВЕРТКИ

Состоян

S

T

F

E

els

«;»

«+»

i

«#

ие

 

 

 

 

e

 

 

 

»

1

о

T1

 

E21,E

 

 

 

i31,i

 

 

к

1

 

51

 

 

 

6

 

i31,i6

 

 

 

 

 

«+»32.

«+»5

 

 

 

 

 

 

 

 

R6

2

 

 

 

 

 

 

 

 

 

 

 

 

267

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

S1:

T (1), <<#>>

- S2

 

E (2), else

-

S5

 

E (5), else,<<+>>

 

 

 

i (3), else

-

S6

 

i (6), else, <<+>>

 

 

S2:

ELSE (1), <<#>>

- S3

S3:

F (1), <<#>>

-

S4

 

E (4), <<;>>

-

S7

 

E (5), <<;>>,<<+>>

 

 

 

i (6), <<;>>,<<+>>

-

S12

S4:

F(1) ;(1), <<#>>

-

S11

S5:

E(2), else

 

R2

 

E(5), else,<<+>>

-

S9

S6:

i (3), else

-

S8

 

i (6), else,<<+>>

 

R6

S7:

E(4), <<;>>

R4

 

+(5), <<;>>,<<+>>

-

S9

S8:

else

 

R3

S9:

i(5), <<;>>,else,<<+>>

-

S10

S10

(5), <<;>>,else,<<+>>

R5

S11

# (1), <<#>>

R1

S12

(6), <<;>>,<<+>>

R6

В полном алгоритме LR(1) состояния, соответствующие одинаковым грамматическим вхождениям по различным символам следователям, считаются различными. Hапример, состояние 10

S10 (5), <<;>>,else,<<+>> R5

i5 else +

i5 ; =

надо разбить на два состояния.

268

ТЕОРИЯ ЯЗЫКОВ ПРОГРАММИРОВАНИЯ И МЕТОДЫ ТРАНСЛЯЦИИ

В LR(1) определение состояния требует учета символов следователей.

12. Включение действий в синтаксис. Транслирующие грамматики.

Анализ и синтез в компиляции удобно рассматривать отдельно, но на практике это часто происходит параллельно. Это совершенно очевидно для однопроходного компилятора, в много проходных – параллельно с синтаксическим разбором создается промежуточный код.

Пример перевода арифметического выражения в тетрады:

Параллельно с грамматическим разбором выполняются действия – генерируются тетрады(четверки)

Грамматика + действие для арифметических выражений выглядит так:

<S> ----> <E> A4

 

<E> ----> <T> ¦ <E> + A1

<T> A3

<T> ---->

<F> ¦ <T> * A1

<F> <A3>

<F> ---->

'-' A1 <F> A2 ¦ id A1 ¦ (E)

A1 - поместить в стек для любого идентификатора

А3 - взять три элемента из стека, напечатать их припечатать знак «=» и очередной номер (целое число) поместить полученное целое число в стек.

А2 - взять два элемента из стека напечатать их припечатать знак «=» и очередной номер (целое число) поместить полученной целое число в стек.

А4 - взять один элемента из стека

Грамматика для четверок

<S>

---> <OPER> <OP1> <OPER> = < INT>

 

---> <OP2> <OPER> = <INT>

<OPER> ---> INT ¦ ID

<INT>

---> DIGIT ¦ DIGIT <INT>

<OP1 >

---> + ¦ x

<OP2 >

---> -

Пример (-a + b) * (c + d)

 

Литера

 

 

Действия

 

 

Выход

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- (минус)

 

А1 поместить в стек «а»

 

 

 

 

 

 

 

 

 

 

 

а

 

А1 поместить в стек «а»

 

 

 

 

 

 

 

 

 

 

 

 

269

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]