Смекни!
smekni.com

Программно методический комплекс для обучения процессу создания компиляторов (стр. 10 из 14)

При обнаружении терминального символа в грамматике БНФ, необходимо осуществить переход на первый элемент конструкции с тем же именем. В таблице построений определяется номер последней не занятой строки в формируемой таблице переходов. Номером следующей позиции указывается номер этой строки, номер столбца – 1. Значение вносимого значения должно указывать на вторую ячейку последней пустой строки. Следующим шагом заполняется значение текущий позиции, адрес возврата и адрес следующей позиции. Например. После нахождения терминального символа <prog-name> начинает рассматриваться первый элемент конструкции <prog-name> – id. В формируемой таблице переходов последней свободной строкой является строка 2, на нее и осуществляется переход, следующая позиция указывает на строку 2, столбец 1 (шаг 2). На третьем шаге в ячейку возврата 2,1 (где 2 – номер строки, 1 – номер столбца) будет внесено значение, указывающее на ячейку 1,4, т.к. переход осуществлен из ячейки 1,3. Текущая позиция – 2,1, следующая позиция – 2,2.

При возврате возникают другие трудности. К примеру, при окончании конструкции происходит переход на пустую ячейку, затем осуществляется переход на ячейку возврата. Значение, заполненное в ячейке возврата ищется по таблице. По полученному значению осуществляется переход. Например, при окончании конструкции <id-list> (шаг 20), текущей ячейкой оказывается ячейка 5,7. Затем производится переход в ячейку 5,1 (шаг 21). По таблице определяем, что адрес возврата @4,3 (значение из шага 14), т.е. перейти на четвертую строку, третий столбец.

Далее отыскивается положение в грамматике БНФ по имени предыдущей позиции. Например, после перехода в ячейку 4,3 (шаг 22) отыскиваем в таблице имя элемента грамматики ячейки 4,2 (значение из шага 13), им оказывается нетерминальный символ <id-list> конструкции <dec>. По грамматике БНФ определяется, что следующий элемент конструкции <dec> является «:».


Таблица 13 – Таблица построений

Шаги Таблица кодов лексем Имя в программе Элемент грамматики БНФ Результат сравнения Формируемая таблица переходов Выполненное действие
текущая позиция следующая позиция
позиция табл код, специф тип имя текущая конструкция тип табл

код

(для ТС)

строка столбец вносимое значение строка столбец
1 1 1 1 ТС PROGRAM PROGRAM <prog> –ТС 1 1 + 1 2 $1,1 1 3
2 2 2 1 ИД Prog1 <prog-name> <prog> НС 1 3 @2,2 2 1
3 2 2 1 ИД Prog1 2 1 @1,4 2 2
4 2 2 1 ИД Prog1 id <prog-name> ИД 2 + 2 2 $2,1 2 3
5 3 1 27 ТС ; ; <prog-name> –ТС 1 27 + 2 3 $1,27 2 4
6 4 1 2 ТС VAR <prog-name> 2 4 2 1 конец конструкции
7 4 1 2 ТС VAR 2 1 1 4 переход
8 4 1 2 ТС VAR VAR <prog> –ТС 1 2 + 1 4 $1,2 1 5
9 5 2 2 ИД a <dec-list> <prog> НС 1 5 @3,2 3 1
10 5 2 2 ИД a 3 1 @1,6 3 2
11 5 2 2 ИД а <dec> <dec-list> НС 3 2 @4,2 4 1
12 5 2 2 ИД а 4 1 @3,3 4 2
13 5 2 2 ИД а <id-list> <dec> НС 4 2 @5,2 5 1
14 5 2 2 ИД а 5 1 @4,3 5 2
15 5 2 2 ИД а id <id-list> ИД 2 + 5 2 $2,2 5 3
16 6 1 29 ТС , , <id-list> ТС 1 29 + 5 3 $1,29 5 4
17 7 2 3 ИД b id <id-list> ИД 2 + 5 4 $2,3 5 5
18 8 1 29 ТС , , <id-list> ТС 1 29 + 5 5 $1,29 5 6
19 9 2 4 ИД c id <id-list> ИД 2 + 5 6 $2,4 5 7
20 10 1 31 ТС : <id-list> 5 7 5 1 конец конструкции
21 10 1 31 ТС : 5 1 4 3 переход
22 10 1 31 ТС : : <dec> ТС 1 31 + 4 3 : 4 4
23 11 1 5 ТС INTEGER <type> <dec> НС 4 4 @6,1 6 1
24 11 1 5 ТС INTEGER 6 1 @4,5 6 2
25 11 1 5 ТС INTEGER INTEGER <type> ТС 1 5 + 6 2 $1,5 6 3
26 12 1 27 ТС ; <type> 6 3 6 1 конец конструкции
27 12 1 27 ТС ; 6 1 4 5 переход
28 12 1 27 ТС ; <dec> 4 5 4 1 конец конструкции
29 12 1 27 ТС ; 4 1 3 3 переход
30 12 1 27 ТС ; ; <dec-list> –ТС 1 27 + 3 3 $1,27 3 4
31 13 1 3 ТС BEGIN <dec-list> 3 4 3 1 конец конструкции
32 13 1 3 ТС BEGIN 3 1 1 6 переход
33 13 1 3 ТС BEGIN BEGIN <prog> ТС 1 3 + 1 6 $1,3 1 7
34 14 2 2 ИД а <stmt-list> <prog> –НС 1 7 @7,2 7 1
35 14 2 2 ИД а 7 1 @1,8 7 2
36 14 2 2 ИД а <stmt> <stmt-list> НС 7 2 @8,2 8 1
37 14 2 2 ИД a 8 1 @7,3 8 2
38 14 2 2 ИД a <assign> <stmt> НС 8 2 @9,2 9 1
39 14 2 2 ИД a 9 1 @8,3 9 2

Продолжение таблицы 13

Шаги Таблица кодов лексем Имя в программе Элемент грамматики БНФ Результат сравнения Формируемая таблица переходов Выполненное действие
текущая позиция следующая позиция
позиция табл код, специф тип имя текущая конструкция тип табл

код

(для ТС)

строка столбец вносимое значение строка столбец
40 14 2 2 ИД a id <assign> ИД 2 + 9 2 $2,2 9 3
41 15 1 28 ТС := := <assign> ТС 1 28 + 9 3 $1,28 9 4
42 16 3 1 ЛЦ 1 <exp> <assign> НС 9 4 @10,2 10 1
43 16 3 1 ЛЦ 1 10 1 @9,5 10 2
44 16 3 1 ЛЦ 1 <exp> ­–ТС 1 33 10 2
45 16 3 1 ЛЦ 1 <term> <exp> НС 10 2 @11,2 11 1
46 16 3 1 ЛЦ 1 11 1 @10,3 11 2
47 16 3 1 ЛЦ 1 <factor> <term> НС 11 2 @12,2 12 1
48 16 3 1 ЛЦ 1 12 1 @11,3 12 2
49 16 3 1 ЛЦ 1 id <factor> ИД 2 12 2
50 16 3 1 ЛЦ 1 int <factor> ЛЦ 3 + 12 2 $3,1 12 3
51 17 1 32 ТС + <factor> 12 3 12 1 конец конструкции
52 17 1 32 ТС + 12 1 11 3 переход
53 17 1 32 ТС + * <term> ТС 1 34 11 3
54 17 1 32 ТС + DIV <term> ТС 1 17 11 3
55 17 1 32 ТС + / <term> ТС 1 37 11 3
56 17 1 32 ТС + <term> 11 3 11 1 конец конструкции
57 17 1 32 ТС + 11 1 10 3 переход
58 17 1 32 ТС + + <exp> ТС 1 32 + 10 3 $1,32 10 4
59 18 2 3 ИД b <term> <exp> НС 10 4 @13,2 13 1
60 18 2 3 ИД b 13 1 @10,5 13 2
61 18 2 3 ИД b <factor> <term> НС 13 2 @14,2 14 1
62 18 2 3 ИД b 14 1 @13,3 14 2
63 18 2 3 ИД b id <factor> ИД 2 + 14 2 $2,3 14 3
64 19 1 34 ТС * <factor> 14 3 14 1 конец конструкции
65 19 1 34 ТС * 14 1 13 3 переход
66 19 1 34 ТС * * <term> ТС 1 34 + 13 3 $1,34 13 4
67 20 1 35 ТС ( <factor> <term> 13 4 @15,2 15 1
68 20 1 35 ТС ( <term> 15 1 @13,5 15 2
69 20 1 35 ТС ( id <factor> ИД 2 15 2
70 20 1 35 ТС ( int <factor> ЛЦ 3 15 2
71 20 1 35 ТС ( real <factor> ЛВ 3 15 2
72 20 1 35 ТС ( ( <factor> ТС 1 35 + 15 2 $1,35 15 3
73 21 2 2 ИД а <exp> <factor> НС 15 3 @16,2 16 1
74 21 2 2 ИД а 16 1 @15,4 16 2
75 21 2 2 ИД а <exp> ­–ТС 1 33 16 2
76 21 2 2 ИД а <term> <exp> НС 16 2 @17,2 17 1
77 21 2 2 ИД а 17 1 @16,3 17 2
78 21 2 2 ИД а <factor> <term> НС 17 2 @18,2 18 1

Продолжение таблицы 13