| Шаги | Таблица кодов лексем | Имя в программе | Элемент грамматики БНФ | Результат сравнения | Формируемая таблица переходов | Выполненное действие | |||||||||||
| текущая позиция | следующая позиция | ||||||||||||||||
| позиция | табл | код, специф | тип | имя | текущая конструкция | тип | табл | код (для ТС) | строка | столбец | вносимое значение | строка | столбец | ||||
| 79 | 18 | 1 | @17,3 | 18 | 2 | ||||||||||||
| 80 | 21 | 2 | 2 | ИД | а | id | <factor> | ИД | 2 | + | 18 | 2 | $2,2 | 18 | 3 | ||
| 81 | 22 | 1 | 33 | ТС | – | 18 | 3 | 18 | 1 | конец конструкции | |||||||
| 82 | 22 | 1 | 33 | ТС | – | 18 | 1 | 17 | 3 | переход | |||||||
| 83 | 22 | 1 | 33 | ТС | – | * | <term> | ТС | 1 | 34 | – | 17 | 3 | ||||
| 84 | 22 | 1 | 33 | ТС | – | DIV | <term> | ТС | 1 | 17 | – | 17 | 3 | ||||
| 85 | 22 | 1 | 33 | ТС | – | / | <term> | ТС | 1 | 37 | – | 17 | 3 | ||||
| 86 | 22 | 1 | 33 | ТС | – | 17 | 3 | 17 | 1 | конец конструкции | |||||||
| 87 | 22 | 1 | 33 | ТС | – | 17 | 1 | 16 | 3 | переход | |||||||
| 88 | 22 | 1 | 33 | ТС | – | + | <exp> | ТС | 1 | 32 | – | 16 | 3 | ||||
| 89 | 22 | 1 | 33 | ТС | – | – | <exp> | ТС | 1 | 33 | + | 16 | 3 | $1,33 | 16 | 4 | |
| 90 | 23 | 2 | 4 | ИД | с | <term> | <exp> | НС | 16 | 4 | @19,2 | 19 | 1 | ||||
| 91 | 23 | 2 | 4 | ИД | с | 19 | 1 | @16,5 | 19 | 2 | |||||||
| 92 | 23 | 2 | 4 | ИД | с | <factor> | <term> | НС | 19 | 2 | @20,2 | 20 | 1 | ||||
| 93 | 23 | 2 | 4 | ИД | с | 20 | 1 | @19,3 | 20 | 2 | |||||||
| 94 | 23 | 2 | 4 | ИД | c | id | <factor> | ИД | 2 | + | 20 | 2 | $2,4 | 20 | 3 | ||
| 95 | 24 | 1 | 36 | ТС | ) | <factor> | 20 | 3 | 20 | 1 | конец конструкции | ||||||
| 96 | 24 | 1 | 36 | ТС | ) | 20 | 1 | 19 | 3 | переход | |||||||
| 97 | 24 | 1 | 36 | ТС | ) | * | <term> | – | 19 | 3 | |||||||
| 98 | 24 | 1 | 36 | ТС | ) | DIV | <term> | – | 19 | 3 | |||||||
| 99 | 24 | 1 | 36 | ТС | ) | / | <term> | – | 19 | 3 | |||||||
| 100 | 24 | 1 | 36 | ТС | ) | <term> | 19 | 3 | 19 | 1 | конец конструкции | ||||||
| 101 | 24 | 1 | 36 | ТС | ) | 19 | 1 | 16 | 5 | переход | |||||||
| 102 | 24 | 1 | 36 | ТС | ) | + | <exp> | ТС | 1 | 32 | – | 16 | 5 | ||||
| 103 | 24 | 1 | 36 | ТС | ) | – | <exp> | ТС | 1 | 33 | – | 16 | 5 | ||||
| 104 | 24 | 1 | 36 | ТС | ) | <exp> | 16 | 5 | 16 | 1 | конец конструкции | ||||||
| 105 | 24 | 1 | 36 | ТС | ) | 16 | 1 | 15 | 4 | переход | |||||||
| 106 | 24 | 1 | 36 | ТС | ) | ) | <factor> | ТС | 1 | 36 | + | 15 | 4 | $1,36 | 15 | 5 | |
| 107 | 25 | 1 | 27 | ТС | ; | <factor> | 15 | 5 | 15 | 1 | конец конструкции | ||||||
| 108 | 25 | 1 | 27 | ТС | ; | 15 | 1 | 13 | 5 | переход | |||||||
| 109 | 25 | 1 | 27 | ТС | ; | * | <term> | ТС | 1 | 34 | – | 13 | 5 | ||||
| 110 | 25 | 1 | 27 | ТС | ; | DIV | <term> | ТС | 1 | 17 | – | 13 | 5 | ||||
| 111 | 25 | 1 | 27 | ТС | ; | / | <term> | ТС | 1 | 37 | – | 13 | 5 | ||||
| 112 | 25 | 1 | 27 | ТС | ; | 13 | 5 | 13 | 1 | конец конструкции | |||||||
| 113 | 25 | 1 | 27 | ТС | ; | 13 | 1 | 10 | 5 | переход | |||||||
| 114 | 25 | 1 | 27 | ТС | ; | + | <exp> | ТС | 1 | 32 | 10 | 5 | |||||
| 115 | 25 | 1 | 27 | ТС | ; | – | <exp> | ТС | 1 | 33 | 10 | 5 | |||||
| 116 | 25 | 1 | 27 | ТС | ; | 10 | 5 | 10 | 1 | конец конструкции | |||||||
| 117 | 25 | 1 | 27 | ТС | ; | 10 | 1 | 9 | 5 | переход | |||||||
Продолжение таблицы 13
| Шаги | Таблица кодов лексем | Имя в программе | Элемент грамматики БНФ | Результат сравнения | Формируемая таблица переходов | Выполненное действие | |||||||||||
| текущая позиция | следующая позиция | ||||||||||||||||
| позиция | табл | код, специф | тип | имя | текущая конструкция | тип | табл | код (для ТС) | строка | столбец | вносимое значение | строка | столбец | ||||
| 118 | 25 | 1 | 27 | ТС | ; | <assign> | 9 | 5 | 9 | 1 | конец конструкции | ||||||
| 119 | 25 | 1 | 27 | ТС | ; | 9 | 1 | 8 | 3 | переход | |||||||
| 120 | 25 | 1 | 27 | ТС | ; | <stmt> | 8 | 3 | 8 | 1 | конец конструкции | ||||||
| 121 | 25 | 1 | 27 | ТС | ; | 8 | 1 | 7 | 3 | переход | |||||||
| 122 | 25 | 1 | 27 | ТС | ; | ; | <stmt-list> | –ТС | 1 | 27 | + | 7 | 3 | $1,27 | 7 | 4 | |
| 123 | 26 | 1 | 4 | ТС | END | <stmt-list> | 7 | 4 | 7 | 1 | конец конструкции | ||||||
| 124 | 26 | 1 | 4 | ТС | END | 7 | 1 | 1 | 8 | переход | |||||||
| 125 | 26 | 1 | 4 | ТС | END | END | <prog> | ТС | 1 | 4 | + | 1 | 8 | $1,4 | 1 | 9 | |
| 126 | 27 | 1 | 30 | ТС | . | . | <prog> | ТС | 1 | 30 | + | 1 | 9 | $1,30 | 1 | 10 | |
| 127 | 1 | 10 | 1 | 1 | конец конструкции | ||||||||||||
| 128 | 1 | 1 | |||||||||||||||
Таблица 14 – Формируемая таблица переходов
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 1 | PROGRAM$1,1 | <prog-name>@2,2 | VAR$1,2 | <dec-list>@3,2 | BEGIN$1,3 | <stmt-list>@7,2 | END$1,4 | .$1,30 | |
| 2 | <prog-name> | @1,4 | prog1$2,1 | ;$1,27 | |||||
| 3 | <dec-list> | @1,6 | <dec>@4,2 | ;$1,27 | |||||
| 4 | <dec> | @3,3 | <id-list>@5,2 | :$1,31 | <type>@6,2 | ||||
| 5 | <id-list> | @4,3 | a$2,2 | ,$1,29 | b$2,3 | ,$1,29 | c$2,4 | ||
| 6 | <type> | @4,5 | INTEGER$1,5 | ||||||
| 7 | <stmt-list> | @1,8 | <stmt>@8,2 | ;$1,27 | |||||
| 8 | <stmt> | @7,3 | <assign>@9,2 | ||||||
| 9 | <assign> | @8,3 | a$2,2 | :=$1,28 | <exp>@10,2 | ||||
| 10 | <exp> | @9,5 | <term>@11,2 | +$1,32 | <term>@13,2 | ||||
| 11 | <term> | @10,3 | <factor>@12,2 | ||||||
| 12 | <factor> | @11,3 | 1$3,1 | ||||||
| 13 | <term> | @10,5 | <factor>@14,2 | *$1,34 | <factor>@15,2 | ||||
| 14 | <factor> | @13,3 | b$2,3 | ||||||
| 15 | <factor> | @13,5 | ($1,35 | <exp>@16,2 | )$1,36 | ||||
| 16 | <exp> | @15,4 | <term>@17,2 | –$1,33 | <term>@19,2 | ||||
| 17 | <term> | @16,3 | <factor>@18,2 | ||||||
| 18 | <factor> | @17,3 | a$2,2 | ||||||
| 19 | <term> | @16,5 | <factor>@20,2 | ||||||
| 20 | <factor> | @19,3 | c$2,4 |
Для наглядного отображения полученных грамматик используют синтаксические деревья, пример показан на рисунке 3.
На основе введенных значений формируемой таблицы переходов в программу SINAN строится (формируется) синтаксическое дерево (дерево грамматического разбора).
Деревья могут быть представлены в вертикально как показано на рисунке 5, а и горизонтально – рисунок 5, б.
а)
б)
Рисунок 5 – а) вертикальное дерево, б) горизонтальное дерево
| |
Рисунок 6 – Горизонтальное синтаксическое дерево
На рисунке 6 показано горизонтальное синтаксическое дерево, построенное по следующей программе:
PROGRAM prog1;
VAR a,b:INTEGER;
s:STRING;
BEGIN
b:=78;
s:='Дерево';
WRITE(s);
a:=b*(2+a);
END.
Функции семантического анализатора: