Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

7.1 Понятие основы

Основа строки — это подстрока, кото­рая совпадает с правой частью продукции и свертка которой в левую часть продукции представляет собой один шаг обращенного правого порождения.

Во многих случаях крайняя слева подстрока β соответствующая правой части некоторой продукции A не является основой, поскольку свертка в соответствии с продукцией Aβ приводит к строке, которая не может быть свернута к стартовому символу. Если в примере 18 заменить во второй строке aAbcde символ b нетерминалом А, то получим строку aAAcde, которая не может быть свернута в S. Поэтому оп­ределение основы должно быть более точное.

Основа правосентенциальной формы γ является продукцией Aβ и позицией строки β в γ, такими, что β может быть заменена нетерминалом А для получения предыдущей правосентенциальной формы в правом порождении γ. Таким об­разом, если SαAwαβw, то Aβ в позиции после а представляет собой основу строки aβw. Строка w справа от основы содержит только терминальные символы. Если грамматика однозначна, то каждая правосентенциальная форма грамматики имеет ровно одну основу.

Пример 19

Рассмотрим следующую грамматику

  1. EE+E

  2. EE*E

  3. E (E)

  4. E → id

и правое порождение

E E+E

E+E*E

E+E*id3

E+id2*id3

id1+id2*id3

Отметили подстрочными индексами id и подчеркнули основу каждой правосентенциальной формы. Например, id1 представляет собой основу право- сентенциальной формы id1+id2*id3, поскольку id является правой частью продукции Еid, и замена id1 на Е приведет к предыдущей правосентенциальной форме E+id2*id3. Строка справа от основы состоит только из терминальных символов.

Поскольку грамматика из примера 19 неоднозначна, имеется еще одно правое порождение той же строки:

E E+E

E*id3

E+E*id3

E+id2*id3

id1+id2*id3

Рассмотрим правосентенциальную форму E+E*id3. В этом порождении E+E— основа E+E*id3, в то время как в ранее представленном порождении, ее основой яв­ляется id3.

В этом примере рассмотрены два правых порождения. Первое порождение дает оператору * больший приоритет, чем оператору +, в то время как во втором порождении выше приоритет оператора +.

Пример 20

Рассмотрим грамматику из примера 19 и входную строку id1+id2*id3. После­довательность сверток, приводящая входную строку к стартовому символу E, показана на рис.31. Последовательность правосентенциальных форм в этом примере представляет собой обращение первой последовательности правых порождений.

Правосентенциальная форма

Основа

Сворачивающая продукция

id1+id2+id3

E+id2*id3

E+E*id3

E+E*E

E

id1

id2

id3

E*E

E+E

E → id

E → id

E → id

E → E*E

E → E+E

Рис. 31. Свертки, выполняемые ПС-анализатором

7.2 Стековая реализация пс-анализа

Существует две проблемы при синтаксическом анализе методом ПС-анализа. Первая заключается в обнаружении подстроки для свертки в правосентенциальной форме, вторая — в определении, какая именно продукция должна быть выбрана, если имеет несколько продукций с соответствующей подстрокой в правой части. Достаточно удобный путь реализации ПС-анализатора состоит в использовании стека для хранения символов грамматики и входного буфера для хранения анализируемой строки. В качестве маркера дна стека используется $, и этот же символ является маркером правого конца входной строки. Изначально стек пуст, а входной буфер содержит строку w$.