Скачиваний:
27
Добавлен:
02.05.2014
Размер:
884.22 Кб
Скачать

3. Проектирование синтаксического анализатора

3.1. Исходные данные

Для программной реализации процесса построения дерева вывода требуется написать программу, которая выполняет синтаксический разбор текста по заданной КС-грамматике с построением дерева разбора. Текст на входном языке задан в виде текстового файла. Программа должна выдавать сообщения о наличие во входном тексте ошибок.

3.2. Построение синтаксического анализатора

Синтаксический анализатор выполняет две основные задачи: проверка правильности конструкций программы, которая представляется в виде уже выделенных слов входного языка, и преобразование её в вид, удобный для дальнейшей семантической (смысловой) обработки и генерации кода. Одним из таких способов представления является дерево синтаксического разбора.

МП-автоматом выполняется алгоритм «сдвиг-свертка» для грамматики операторного предшествования. Для моделирования его работы необходима входная цепочка символов и стек, в котором автомат может обращаться не только к самому верхнему символу, но и к некоторой цепочке символов на вершине стека. После завершения алгоритма «свиг-свертка» решение о принятии цепочки зависит от содержимого стека. Автомат принимает цепочку, если в результате завершения алгоритма он находится в состоянии, когда в стеке находятся начальный символ грамматики и символ конца строки. Выполнение алгоритма может быть прервано, если на одном из его шагов возникла ошибка.

Исходная КС-грамматика:

G ({ prog, end., if, then, else, endif, begin, end, , white, do, and, or, not, =, <, >, (, ),{, }, -, +, *, /, a,;, :=}, {S, L, O, B, C, K, D, H, E, T},P, S)

P:

S → prog L end.

L → O | L ; O | L ;

O → if B then O else O endif | if B then O endif | begin L end

| while (B) do O| a:=E

B → B or C | C

C → C and D | D

D →not D | H

H → E < E | E > E | E = E | (B)

E → E – T | E + T | E * T | E / T| T

T → (E) | a

Смысл нетерминальных символов грамматики:

S – вся программа,

L – последовательность операторов(может состоять из одного оператора),

O – оператор,

B­, C, D – логическое выражение и его элементы,

H – операции сравнения или логические выражения в скобках,

E,T – арифметические выражения и его элементы,

a – переменная,

КС-языки делятся на классы в соответствии со структурой правил их грамматик. Одним из таких классов является класс грамматик предшествования. Они используются для синтаксического разбора цепочек с помощью алгоритма <<сдвиг-свертка>>.

Грамматикой операторного предшествования называется приведенная КС-грамматика без l-правил, в которой правые части продукций не содержат смежных нетерминальных символов. Для грамматики операторного предшествования строится матрица операторного предшествования, которая содержит только терминальные символы грамматики. Отношения =., <. и >. называют отношениями предшествования.

Исходная КС-грамматика, представленная выше, является грамматикой операторного предшествования.

Строятся множества крайних левых и крайних правых символов L(U), R(U) относительно всех нетерминальных символов грамматики. Результат построения приведен в табл. 2.

Таблица 2

U

L(U)

R(U)

T

(, a

), a

E

E, T

T

H

(, E

E, )

D

not, H

D, H

C

C, D

D

B

B, C

C

O

if, begin, while, (

endif, end, O, M

M

a

E

L

L, O

O, ;

S

prog

end.

На основе полученных множеств строятся множества крайних левых и крайних правых терминальных символов Lt(U), Rt(U) относительно всех нетерминальных символов грамматики. Результат построения приведен в табл. 3.

Таблица 3

U

Lt(U)

Rt(U)

T

(, a

), a

E

-, +,*, /, (, a

-, +,*, /, ), a

H

<, >, =, (, -, +,*, /, a

<, >, =, ), -, +,*, /, a, c

D

not, <, >, =, (, -, +,*, /, a

not, <, >, =, ), -, +,*, /, a, c

C

and, not, <, >, =, (, -, +,*, /, a

and, not, <, >, =, ), -, +,*, /, a,

B

or, and, not, <, >, =, (, -, +,*, /, a

or, and, not, <, >, =, ), -, +,*, /, a

O

if, begin, while, a

endif, end, do, :=, -, +, ), a, c

M

a

:=, -, +, ), a

L

;, if, begin, a

;, endif, end, do, :=, -, +, ), a

S

prog

end.

На основе данных множеств и правил исходной КС-грамматики <<G>> построим матрицу операторного предшествования, которая представлена в приложении В.

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

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

Остовная грамматика, полученная на основе исходной грамматики:

G' ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, and, or, not, =, <, >, (, ), -, +,*, /, a, ;, :=}, {E}, P', S)

E → program E end.

E → E | E ; E | E ;

E → if E then E else E endif | if E then E endif| begin E end| while (E) do E| E

E → a:=E

E → E or E | E

E → E and E | E

E → not E | E

E → E < E | E > E | E = E | (E)

E → E – E | E + E | E * E| E / E | E

E → (E) | a

Для различия скобок, определяющих соответственно приоритет арифметических и логических операций, остовная грамматика дополняется нетерминальным символом <<B>>, который будет обозначать логические выражения.

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

G' ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, and, or, not, =, <, >, (, ), -, +,*, /, a, ;, :=}, {E}, P', S)

E → program E end.

E → E | E ; E | E ;

E → if B then E else E endif | if B then E endif | begin E end |while (E) do E| E

E → a:=E

B → B or B | B

B → B and B | B

B → not B | B

B → E < E | E > E | E = E | (B)

E → E – E | E + E | E * E| E / E | E

E → (E) | a

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