Главная  Терминология Хоора 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 [ 110 ] 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

переводится в оператор

while сЛ in £ do Г(5)

где T{S) есть отображение S в соответствии с правилами ВЗ-В7, а L есть множество L = first{S) (с^ предыдущее примечание). Вб. Элемент графа, обозначающий другой граф А

переводится в оператор обращения к процедуре А. ВТЭлемепт графа^,-ебоз№ачающий терминальный символ

переводится в оператор

if сА = X then read(ch) else error

где error - процедура, к которой обращаются при по< явлении неправильной конструкции.

Теперь покажем применение этих правил на примере преобразования редуцированного графа, изображенного на

program parse (input, output); var ch: char; procedure . 4;

begin if СЙ = x then read(ch) else ifcA (then begjhi read(ch); A; while ch = + do begin read(ch); A end;

If ch ) tben read{ch) else error end else error

end ; begin read(ch); A end

Программа 5.1. Грамматический разбор для синтаксиса из прим. 5.

рис. 5.2 (пример 5), в программу грамматического разбора (программа 5.1):



j]pH ЭТОМ преобразовании свободно применялись некоторые дчевидные правила программирования, позволяющие упростить программу. Например, при буквальном переводе четвертая строка имела бы вид

if ей = Vthen

if ch = .х' then read{ch) else error ----else....

CHO, что ее можно сократить, как это сделано в программе. Операторы чтения в пятой и седьмой строках тоже получены с помощью такого же упрощения.

По-видимому, полезно определить, когда вообще возможны подобные упрощения, и показать это непосредственно в виде графов. Два основных случая покрываются следующими дополнительными правилами: В4а

©-

4s>

itch = х/then begin reaJ(cA); 7(5,) end els6 if cA = V then begin readich); r(Sj) end else

if ch =. x, then begin readich); T(S ) end else error

>a

V J

wiiilecA

= V do

begin readich); Т{$) еай

. Кроме того, часто встречающуюся конструкцию

readich); T(Sy, . while В do

begin r f(cA); ад end



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

Итак, грамматика, мы предполагаем, что она представлена в виде детерминированного множества синтаксических графов) преобразуется в подходящую структуру данных, а не в структуру программ [5.2]. Естественный способ представить граф - это ввести узел для каждого символа и связать эти узлы с помощью ссылок. Следовательно, таблица - это не просто массив. Правила преобразования очевидны и приведены ниже. Узлы этой структуры представляют собой записи с вариантами, один для терминального, а другой -для нетерминального символа. Первый идентифицируется терминальным символом, который он обозначает, второй - ссылкой на структуру данных, представляющую соответствующий нетерминальный символ. Оба варианта содержат две ссылки: одна указывает на следующий символ, последователь {sue), а дрУ гая связана со списком возможных альтернатив (alt). Описа-чие соответствующего типа данных приведено в (5.9), а графически узел можно изобразить как

МОЖНО, разумеется, выразить короче:

repeat readich); T(S) until В

Мы намеренно не описываем пока процедуру error ( ощик ка ). Поскольку сейчас нас интересует лишь, как определит правильно ли входное предложение, мы можем считать, ц- эта процедура заканчивает работу программы. Конечно, на практике в случае появления неправильных конструкции нужно использовать более тонкие приемы. Они будут рас! сматриваться в разд. 5.9.

S.5. ПОСТРОЕНИЕ ТАБЛИЧНО-УПРАВЛЯЕМОЙ ПРОГРАММЫ ГРАММАТИЧЕСКОГО РАЗБОРА

Вместо того чтобы для каждого языка составлять спе-




1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 [ 110 ] 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133