ВУЗ:
Составители:
димо, поскольку в соответствии с грамматикой (правило 8) первым операндом операции умножения
должен быть <слагаемое>, а не <значение>. Так как для нашего метода имена нетерминальных симво-
лов несущественны, то подобные переименования становятся ненужным. Собственно говоря, три раз-
личных имени: <арифметическое выражение>, <слагаемое>, <значение> – были включены в граммати-
ку только как средства описания отношения предшествования между операторами (например, для ука-
зания того, что умножение следует выполнять после сложения). Поскольку эта информация содержится
в нашей матрице предшествования, то становится ненужным различать эти три имени в процессе грам-
матического разбора.
Возможный алгоритм метода операторного предшествования приведен на рис. 10.
В данном алгоритме первоначально просматривается цепочка лексем (массив L), устанавливается
отношение предшествования между соседними лексемами по таблице отношений предшествования
(матрица M[n × n]) до тех пор, пока не встретится отношение '>' (блоки 4–5). После этого возвращаемся
по массиву лексем назад, пока между лексемами не встретится отношение '<' (блоки 7–8). Затем лексе-
мы, ограниченные отношениями '< >', записываются во внутреннее представление (блоки 9–10) .
В блоках 12 – 14 элементы массива лексем сдвигаются на длину выведенной цепочки. Так продол-
жается, пока не распознана вся последовательность лексем.
9
10
11
12
13
14
15
1
2
3
4
5
6
7
8
да
нет
1
да
нет
да
нет
M[n1, n2] = '>'
начало
L[0…k]
M[n
×
n]
i = 0
i = i + 1
n1=L[i – 1]
n2=L[i]
j2 = i – 1
j1 = j2
j1 = j1 – 1
n1 = L[j1]
n2 = L[
j
1 + 1]
M[n1, n2] = '<'
x = j1 + 1, j2
вывод L[x]
j = j1
x = i, k
j = j + 1
L[j] = L[x]
k = k – j2 – j1
k
≤
1
конец
1
Рис. 10
Страницы
- « первая
- ‹ предыдущая
- …
- 18
- 19
- 20
- 21
- 22
- …
- следующая ›
- последняя »