Задание на лабораторную работу



Разработать синтаксический анализатор подмножества заданного языка программирования на основе метода LL(1). Варианты заданий приведены в таблице 3.6. Код задания на лабораторную работу состоит из трех компонент.

Первая цифра варианта определяет язык программирования (1- PL0, 2- ASPLE). Описание синтаксиса языков программирования PL0 и ASPLE приведены соответственно в приложениях 1 и 2.

Вторая цифра варианта определяет подмножество языка программирования. Описание подмножеств языков программирования PL0 и ASPLE приведены соответственно в приложениях 3 и 4.

Таблица 3.6

Номер варианта 1 2 3 4 5 6 7 8
Код задания 11П 12С 13П 14С 21П 22С 23П 24С
Номер варианта 9 10 11 12 13 14 15 16
Код задания 11С 12П 13С 14П 21С 22П 23С 24П

 

Третья цифра-язык программирования: П- Паскаль, С -Си.

 

Содержание отчета

3.4.1.Постановка задачи.

3.4.2.Управляющая таблица разбора.

3.4.3.Текст программы.

3.4.4.Описание тестовых примеров.

3.4.5.Распечатка результатов.

Библиографический список

1. А.Ахо, Дж.Ульман. Теория синтаксического анализа, перевода и компиляции. Т.1. Синтаксический анализ. - М.: Мир, 1978. - 612с.

2. Р.Хантер. Проектирование и конструирование компиляторов. - М.: Финансы и статистика, 1984. - 232с.

3. Д.Грис. Конструирование компиляторов для ЦВМ. - М.: Мир, 1975.- 544 с.

 


ЛАБОРАТОРНАЯ РАБОТА № 4. Восходящий синтаксический анализ методом предшествования

Цель работы: Изучение восходящего синтаксического анализа методом предшествования, получение навыков в программировании алгоритмов синтаксического разбора

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

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

Строкам и столбцам управляющей таблицы М (матрицы отношений предшествования) ставятся в соответствие элементы множества 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).

Рис.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

Порядок выполнения работы

 

2.1.Проверить является ли заданная грамматика грамматикой предшествования, при необходимости выполнить соответствующие преобразования.

2.2.Построить управляющую таблицу разбора.

2.3.Разработать и отладить синтаксический анализатор, который должен быть оформлен в виде отдельной процедуры (подпрограммы).


Дата добавления: 2019-02-12; просмотров: 306; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!