Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
31
Добавлен:
02.05.2014
Размер:
2.11 Mб
Скачать

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

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

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

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

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

G ({ prog, end., if, then, else, endif, begin, end, for, to, downto, do, and, or, not, =, <, >, (, ),{, }, -, +, *, /, a, c, ;, :=}, {S, L, O, B, C, K, D, H, E, T, M},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

| for M to E do O| for M downto E do O| M

M→ 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 | c

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

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

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

O – оператор,

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

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

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

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

с – константа.

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

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

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

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

Таблица 2

U

L(U)

R(U)

T

(, a, c

), a, c

E

E, T

T

H

(, E

E, )

D

not, H

D, H

C

C, D

D

B

B, C

C

O

if, begin, for, M

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, c

), a, c

E

-, +,*, /, (, a, c

-, +,*, /, ), a, c

H

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

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

D

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

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

C

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

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

B

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

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

O

if, begin, for, a

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

M

a

:=, -, +, ), a, c

L

;, if, begin, for, a

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

S

prog

end.

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

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

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

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

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

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

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

Соседние файлы в папке Курсовая СПО