Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конпект лекций по ТЯПиМТ.docx
Скачиваний:
221
Добавлен:
27.01.2015
Размер:
329.63 Кб
Скачать

1. S→ab→aAb→aaAb→aaaB→aaabB→aaabbB→aaabbbB→aaabbbb.

2. S→ab→AbB→AbbB→AbbbB→Abbbb→aAbbbb→aaAbbbb→aaabbbb

В этих деревьях первые две вершины и последние совпадут, а все остальные будут различными.

Грамматики различаются на контекстно свободные (КС) и контекстные. Большинство языков программирования описываются КС грамматиками. В КС грамматиках в левой части каждой продукции только один нетерминальный символ. В контекстных грамматиках в левой части продукций символов более одного. В них замена символов зависит от их окружения – контекста. В КС грамматиках нетерминальные символы заменяются в соответствии с продукциями независимо от их расположения среди других символов.

Пример. Грамматический разбор арифметических выражений. Рассмотрим грамматику, описывающую арифметические выражения, содержащие переменные a,b,c, операции сложить, умножить, вычесть и разделить. А также допускающие круглые скобки.

В БНФ эта грамматика может быть описана следующим образом:

выражение› ::= ‹терм›|‹ выражение› +‹терм›|‹выражение› –‹терм›

терм›::= ‹множитель›|‹терм›*‹множитель›|‹терм›/‹множитель›

множитель›::= a|b|c|(‹выражение›)

Используя формальную нотацию КС грамматик и обозначая аксиому языка через E, запишем эти продукции по-другому:

ET|E+T|ET

TF|T*F|T/F

Fa|b|c|(E)

В этой нотации E,T,F - нетерминальные символы. Терминальные символы a, b, c, +, -, *, /, ( , ). Грамматика является однозначной, поскольку каждой сентенции, порождаемой этой грамматикой, соответствует единственное дерево вывода. Например, пусть дана сентенция a*b+c. Дерево вывода для неё будет иметь вид:

E

E + T

T F

T * F

c

F

b

a

Рис.3.3. Дерево грамматического разбора сентенции ab+c.

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

На основании дерева грамматического разбора транслятор построит другое дерево – семантическое, которое просто получается из дерева вывода.

Это дерево будет иметь вид:

+

*

c

a b

Рис.3.4 Семантическое дерево вычисления арифметического выражения.

После соответствующей обработки семантического дерева транслятор сгенерирует программу вычислений: