Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП / Лекция 2.doc
Скачиваний:
45
Добавлен:
11.05.2015
Размер:
220.67 Кб
Скачать

Лекция 2

3. Кс-грамматики и синтаксический анализ сверху вниз

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

3.1. Определения

Определение. Обозначения в написании LL(1)-грамматики означают:

  • L – строки разбираются слева направо;

  • L – используются самые левые выводы;

  • 1 – варианты порождающего правила выбираются с помощью одного предварительного просмотра символа.

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

Пример. Рассмотрим грамматикуG = ({E, E´, T, T´, F}, {id, +, *, (, )}, P, E), гдеP =

(1) ET E´

(2) E´  + T E´

(3) E´  e

(4) TF T´

(5) T´  * F T´

(6) T´  e

(7) F  ( E )

(8) Fid

Нетерминал

Входной символ

id

+

*

(

)

$

E

(1)

(1)

E´

(2)

(3)

(3)

T

(4)

(4)

T´

(6)

(5)

(6)

(6)

F

(8)

(7)

Символом $обозначается конец цепочки.

Пусть G = (N, Σ, P, S)– КС-грамматика. Обозначим вершину магазин какM (MN  Σ  {$})текущий символ входной цепочки – какIN (IN  Σ  {$}), а элемент таблицы разбора – какLT(A, a), гдеAN, a  Σ. Тогда правила разбора будут следующими:

1) Положить в магазин S $

2) Если MN, то

2.1) Если LT(M, IN) = A  α, то

2.1.1) убрать из магазина A

2.1.2) положить в Mправую часть правилаα

2.1.3) Вывести правило A  α

2.2) Иначе – ошибка

3) Иначе если M  Σ, то

3.1) Если M = IN = a, то

3.1.1) убрать aизM

3.1.2) убрать aизIN

3.2) Иначе – ошибка

4) Иначе

4.1) Если M = IN = $, то конец разбора

4.2) Иначе переход на шаг 2

Разбор:

Входная цепочка: id + id*id$

Магазин

Вход

Выход

E $

id + id*id$

ET E´

T E´ $

id + id*id$

TF T´

F T´ E´ $

id + id*id$

Fid

id T´ E´ $

id + id*id$

T´ E´ $

+ id*id$

T´  e

E´ $

+ id*id$

E´  + T E´

+ T E´ $

+ id*id$

T E´ $

id*id$

TF T´

F T´ E´ $

id*id$

Fid

id T´ E´ $

id*id$

T´ E´ $

*id$

T´  * F T´

* F T´ E´ $

*id$

F T´ E´ $

id$

Fid

id T´ E´ $

id$

T´ E´ $

$

T´  e

E´ $

$

E´  e

$

$

Определение. Множество терминальныхсимволов-предшественниковопределяется следующим образом:

aS(α)  α + aβ,

где

  • α, β– строки терминалов и/илинетерминалов, α, β  (N  Σ)*;

  • S(α)– множество символов-предшественниковα, S(α)  Σ  {e}.

Это множество символов, с которых могут начинаться строки, выводимые изα.

Пример:

PAc

PBd

Aa

AAa

Bb

BbB

Здесь символы aиb– символы-предшественники дляP.

Определение. Множество терминальныхсимволов-последователейопределяется следующим образом:

aF(A)  αAβ + αaγ,

где

  • A–нетерминал,AN;

  • α, β, γ– строки терминалов и/илинетерминалов, α, β, γ  (N  Σ)*;

  • F(A)– множество символов-последователейA, F(A)  Σ  {$}.

Это множество символов, которые могут следовать за A.

В предыдущем примере aиc– символы-последователи дляA(т.е. появляются непосредственно справа отAпри выводе)

Определение. ЕслиA–нетерминал, то егонаправляющими символами(T) будут символы-предшественникиAи все символы, следующие заA, еслиAможет генерировать пустую строку.

В общем случае, для заданной цепочки αинетерминалаA (Aα)имеем

T(A, α) = {a | (aS(α)  ae)  (α * e и aF(A))}.

Пример:

TAB

APQ

ABC

PpP

Pe

Q qQ

Q e

BbB

Bd

C cC

C f

Эта грамматика дает S(PQ) = {p, q}, S(BC) = {b, d}, поэтому T(A, PQ) = {p, q, b, d} и T(A, BC) = {b, d}.

Из определения LL(1)-грамматики следует, что эти грамматики можно разбирать детерминированносверху вниз.

Соседние файлы в папке ТЯП