Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Синтаксический анализ для грамматики простого предшествования




Cинтаксический анализ для LL(1)-грамматики

Алгоритм синтаксического анализа на основе LL(K)-грамматики относится к классу алгоритмов нисходящего разбора.

Строкам управляющей таблицы М для грамматики G(V,T,P,S) /1/ ставятся в соответствие элементы множества VUTU$ ($-маркер дна стека), столбцам-элементы множества T U "lambda"("lambda" - пустая строка). Перед началом работы алгоритма в рабочий стек заносятся символы $ и S. Возможные значения элементов таблицы и их интерпретация алгоритмом разбора приведены в таблице 3.2.

Таблица 3.2

N п/п Значение элемента таблицы Интерпретация алгоритмом разбора
1 Номер i порождающего правила грамматики Удаление символа из рабочего стека; запись этого символа в выходной стек; запись правой части правила номер i в рабочий стек справа налево, начиная с последнего символа
2 "сдвиг" Удаление символа из рабочего стека; запись его в выходной стек; считывание следующего символа входной цепочки
3 допуск конец работы
4 "ошибка" Вывод сообщения об ошибке; конец работы

 

Для построения управляющей таблицы М по заданной LL(1)-грамматике G(V,T,P,S) можно воспользоваться следующим алгоритмом /1/.

1.Если <A>::=r-правило номер i заданной грамматики, то M(<A>,a)=i для всех a (кроме "lambda"), являющихся терминальными префиксами цепочек, выводимых из r. Если таким префиксом может быть "lambda", то М(<A>,b)=i для всех b, являющихся терминальными символами, которые могут встречаться непосредственно справа от <A>.

2.M(a,a)="сдвиг" для всех a, принадлежащих Т.

3.M($,"lambda")="допуск".

4.Оставшиеся незаполненными элементы таблицы М получают значение "ошибка".

Пример

Грамматика G(V,T,P,S) рассмотренного выше примера не обладает свойством LL(1),поскольку обе правые части для нетерминала<E> (правила 2 и 3) порождают цепочки, начинающиеся одним и тем же терминалом i. То же можно сказать и о правилах для терминала <T>.Преобразуем грамматику G(V,T,P,S) к грамматике G1(V1,T,P1,S), обладающей свойством LL(1).Правила последней примут вид :

1) <S>::=<E> 2) <E>::=<T><X> 3) <X>::=+<E> 4) <T>::=<F><Y>

5) <Y>::=*<T> 6) <F>::=i 7) <X>::="lambda" 8) <Y>::="lambda"

В соответствии с приведенным алгоритмом теперь можно построить управляющую таблицу для LL(1)-анализатора (таблица 3). Таблица 3

  i + * $
<S> 1      
<E> 2      
<T> 4      
<F> 6      
<X>   3   7
<Y>   8 5 8
i сдвиг      
+   сдвиг    
*     сдвиг  
$       сдвиг

 

Незаполненные элементы таблицы имеют значение "ошибка". Проанализируем входную цепочку i*i с помощью алгоритма LL(1)-анализатора. При этом, для облегчения формирования выходного стека, при записи символа в рабочий стек будем снабжать его указателем на символ, являющийся его предком в синтаксическом дереве разбора. Процесс анализа проиллюстрируем таблицей 4.

 

Таблица 3.4

Рабочий стек Вх.символ М(A,a)
<S>,0 $ i M(<S>,i)=1
<E>,1 $ i M(<E>,i)=2
<T>,2 <X>,2 $ i M(<T>,i)=4
<F>,3 <Y>,3 <X>,2 $ i M(<F>,i)=6
i,4 <Y>,3 <X>,2 $ i M(i,i)="сдвиг"
<Y>,3 <X>,2 $ * M(<Y>,*)=5
*,6 <T>,6 <X>,2 $ * M(*,*)="сдвиг"
<T>,6 <X>,2 $ i M(<T>,i)=4
<F>,8 <Y>,8 <X>,2 $ i M(<F>,i)=6
i,9 <Y>,8 <X>,2 $ i M(i,i)="сдвиг"
<Y>,8 <X>,2 $ "lambda" M(<Y>,"lambda")=8
<X>,2 $ "lambda" M(<X>,"lambda")=7
$ "lambda" M($,"lambda"= "допуск"

 

 

В результате анализа получено синтаксическое дерево разбора (рис.3.4.).

<S>
<E>
<T>
<X>
<E>
<Y>
*
<T>
<F>
i
<Y>
“lambda”
“lambda”
i

Рис.3.4. Синтаксическое дерево разбора

 

В выходном стеке это дерево представляется таблицей 3.5.

 

Таблица 3.5

12

<X>,2

11

<Y>,8

10

i,9

9

<F>,8

8

<T>,6

7 *,6  
6

<Y>,3

5

i,4

4

<F>,3

3

<T>,2

2

<E>,1

1

<S>,0

 

Синтаксический анализ для грамматики простого предшествования

 

Алгоритм синтаксического анализа на основе грамматики пред­шествования относится к классу алгоритмов восходящего разбора.

Строкам и столбцам управляющей таблицы М (матрицы отношений предшествования) ставятся в соответствие элементы множества T U V U $ (в строке - символ в вершине рабочего стека, в столбце - входной символ).

Каждую запись рабочего стека представим парой: (символ, знак отношения предшествования символа предыдущей записи стека с данным символом). Перед началом работы алгоритма в стек записывается пара ($,0).

Возможные значения элементов таблицы и их интерпретация ал­горитмом разбора приведены в таблице 4.1.

 

Таблица 4.1

Nп/п

Значение

элемента

таблицы

Интерпретация значения алгоритмом разбора
1

<.

Запись текущего входного символа в выходной стек и в паре со знаком "<." - врабочий стек; если этот символ - нетерминал, установка указателей на него в ближайших к нему n записях выходного стека с пустыми указателями, где n - количество символов в правой части правила для этого нетерминала.
2

=.

Запись текущего входного символа в выходной стек и в паре со знаком "=." - врабочий стек; если этот символ - нетерминал, установка указателей на него в ближайших к нему n записях выходного стека с пустыми указателями, где n - количество символов в правой части правила для этого нетерминала.
3

>.

Удаление из рабочего стека записей (символы которых образуют цепочку w) со знаками отношения =. до первого знака <. включительно; если <A>::=w - правило заданной грамматики, имитация считывания <A> в качестве следующего входного символа.
4 "допуск”

 

Конец работы
5 "ошибка” Вывод сообщения об ошибке, конец работы.

 

 

Отношения предшествования Вирта-Вебера <., =., >. для КС- грамматики G(V,T,P,S) определяются на множестве V U T следующим образом /1/:

1) X<.Y, если в Р есть такое правило <A>::=rX<B>q, что Y является головным символом хотя бы одной из цепочек, выводимых из <B>;

2) X=.Y, если в Р есть правило <A>::=rXYq;

3) X>.a, если a - терминал, и в Р есть правило <A>::=r<B>Yq такое, что X является хвостовым символом хотя бы одной из цепочек, выводимых из <B>, а Y=at, или a является головным символом хотя бы одной из цепочек, выводимых из Y.

 

Для анализа входной цепочки методом предшествования удобно добавлять к ней левый и правый концевые маркеры ($). Будем считать, что $<.X для всех X, являющихся головными символами цепочек, выводимых из <S>, и Y>.$ для всех Y, являющихся хвостовыми символами таких цепочек.

КС-грамматика G(V,T,P,S) называется грамматикой предшествования, если она приведенная, не содержит "lambda"-правил, и для любой пары символов из T U V выполняется не более одного отношения предшествования Вирта-Вебера. Обратимая грамматика предшествования называется грамматикой простого предшествования.

 

Пример

Анализируя грамматику G(V,T,P,S) из п.1.1, заметим, что она не удовлетворяет определению грамматики предшествования, поскольку <T> =. + в соответствии с правилом 2) и <T>>. + в соответствии с правилами 2) и 4). Чтобы избавиться от этого конфликта, преобразуем эту грамматику к грамматике G2(V2,T,P2,S) с правилами:

1) <S>::=<E>

2) <E>::=<X>+<E>

3) <E>::=<X>

4) <T>::=<F>*<T>

5) <T>::=<F>

6) <F>::=i

7) <X>::=<T>

 

Матрица отношений предшествования для грамматики G2 представлена таблицей 4.2

 

Таблица4.2

  <S> <E> <T> <F> <X> i + * $
<S>                 >.
<E>                 >.
<T>             >.   >.
<F>             >. =. >.
<X>             =.    
i             >. >. >.
+   =. <. <. <. <.      
*     =. <.   <.      
$ <. <. <. <. <. <.      

 

Незаполненные элементы матрицы соответствуют парам символов грамматики, для которых не определены отношения предшествования. При использовании этой матрицы в качестве управляющей таблицы в алгоритме синтаксического анализа можно считать, что эти элементы содержат значение "ошибка", а M(<S>,$)="допуск".

 

Проанализируем входную цепочку i*i с использованием метода предшествования. Результат анализа представлен в таблице 4.3.

 

Таблица 4.3

Рабочий стек Вх.символ M(A,a)
$,0 i M($,i)=<.
i,<. $,0 * M(i,*)=>.
$,0 <F> M(<F>,$)=<.
<F>,<. $,0 * M(<F>,*)==.
*,=. <F>,<. $,0 i M(7,i)=<.
i,<. *,=. <F>,<. $,0 $ M(i,$)=>.
*,=. <F>,<. $,0 <F> M(*,<F>)=<.
<F>,<. *,=. <F>,<. $,0 $ M(<F>,$)=>.
*,=. <F>,<. $,0 <T> M(*,<T>)==.
<T>,=. *,=. <F>,<. $,0 $ M(<T>,$)=>.
$,0 <T> M($,<T>)=<.
<T>,<. $,0 $ M(<T>,$)=>.
$,0 <X> M($,<X>)=<.
<X>,<. $,0 $ M(<X>,$)=>.
$,0 <E> M($,<E>)=<.
<E>,<. $,0 $ M(<E>,$)=>.
$,0 <S> M($,<S>)=<.
<S>,<. $,0 $ M(<S>,$)="допуск"

 

 

В результате анализа получено синтаксическое дерево разбора (рис.4.1).

<S>
<E>
<T>
<F>
<T>
*
i
<F>
i

Рис.4.1. Синтаксическое дерево разбора

 

В выходном стеке это дерево представляется таблицей 4.4.

 

 

Таблица 4.4

10 <S>,0
9 <E>,10
8 <X>,9
7 <T>,8
6 <T>,7
5 <F>,6
4 i,5
3 *,7
2 <F>,7
1 i,2

 










Последнее изменение этой страницы: 2018-05-31; просмотров: 293.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...