Методические указания (1114907), страница 9
Текст из файла (страница 9)
Опишем работу подпрограмм, обеспечивающих обработку ошибок:
e1: Эта подпрограмма вызывается из состояния 0. Ожидает идентификатор функции. Вместо этого обнаруживает любой другой символ грамматики.
Помещает в стек символ i, а также размещает над ним состояние 2.
Выдает сообщение об ошибке «Нет названия функции»
e2: Эта подпрограмма вызывается из состояний 1, 2, 6, 7, 9 при обнаружении правой скобки во входном потоке.
Удаляет символ ‘)’ из входного потока.
Выдает сообщение об ошибке «Несбалансированная правая скобка»
e3: Эта подпрограмма вызывается из состояния 2 при обнаружении символа, отличного от левой скобки, во входном потоке.
Помещает в стек символ ‘(’, а так же размещает над ним состояние 3.
Выдает сообщение об ошибке «Отсутствует открывающаяся скобка при описании параметров»
e4: Эта подпрограмма вызывается из состояния 3 при обнаружении символа, отличного от i или правой скобки, во входном потоке.
Удаляет из входного потока неправильный символ.
Выдает сообщение об ошибке «Неправильное описание параметров»
e5: Эта подпрограмма вызывается из состояний 4, 8, 11 при обнаружении символа, отличного от правой скобки, во входном потоке. В состоянии 5 только при обнаружении символа ‘;’.
Помещает в стек символ ‘)’, а так же размещает над ним состояние 6.
e6: Эта подпрограмма вызывается из состояний 5, 10 при обнаружении символа, отличного от правой скобки или запятой, во входном потоке.
Удаляет из входного потока неправильный символ.
Выдает сообщение об ошибке «Неправильное перечисление параметров»
e7: Эта подпрограмма вызывается из состояния 6 при обнаружении символа, отличного от точки с запятой, во входном потоке.
Помещает в стек символ ‘;’, а так же размещает над ним состояние 9.
Выдает сообщение об ошибке «Отсутствует точка с запятой после описания функции»
e8: Эта подпрограмма вызывается из состояний 1, 9 при обнаружении любого символа данной грамматики во входом потоке.
Удаляет неправильный символ из входного потока.
Выдает сообщение об ошибке «Лишние символы после описания функции»
e9: Эта подпрограмма вызывается из состояния 7 при обнаружении символа, отличного от i, во входном потоке.
Помещает в стек символ i, а также размещает над ним состояние 10.
Выдает сообщение об ошибке «Отсутствует идентификатор параметра»
В итоге таблица имеет следующий вид:
Состояние | action | goto | |||||||
( | ) | , | ; | i | $ | D | F | P | |
0 | e1 | e1 | e1 | e1 | s2 | e1 | 1 | ||
1 | e8 | e2 | e8 | e8 | e8 | accept | |||
2 | s3 | e2 | e3 | e3 | e3 | e3 | |||
3 | e4 | r3 | e4 | e4 | s5 | e4 | 4 | ||
4 | e5 | s6 | e5 | e5 | e5 | e5 | |||
5 | e6 | r5 | s7 | e5 | e6 | e6 | 8 | ||
6 | e7 | e2 | e7 | s9 | e7 | e7 | |||
7 | e9 | e2 | e9 | e9 | s10 | e9 | |||
8 | e5 | r2 | e5 | e5 | e5 | e5 | |||
9 | e8 | e2 | e8 | e8 | e8 | r1 | |||
10 | e6 | r5 | s7 | e6 | e6 | e6 | 11 | ||
11 | e5 | r4 | e5 | e5 | e5 | e5 |
-
Примеры разбора текстов, порожденных данной грамматикой с помощью построенной таблицы SLR-анализатора.
Пример1. i(i,i,i);
Стек | Входной поток | Комментарии |
$0 | i(i,i,i);$ | action[I0, i] = s2 Осуществляем перенос i в стек. А так же добавляем в него состояние 2. |
$0i2 | (i,i,i);$ | action[I2, (] = s3 Осуществляем перенос ‘(‘ в стек. А так же добавляем в него состояние 3. |
$0i2(3 | i,i,i);$ | action[I3, i] = s5 Осуществляем перенос i в стек. А так же добавляем в него состояние 5. |
$0i2(3i5 | ,i,i);$ | action[I5, ‘,’] = s7 Осуществляем перенос ‘,’ в стек. А так же добавляем в него состояние 7. |
$0i2(3i5,7 | i,i);$ | action[I7, i] = s10 Осуществляем перенос i в стек. А так же добавляем в него состояние 10. |
$0i2(3i5,7i10 | ,i);$ | action[I10, ‘,’] = s7 Осуществляем перенос ‘,’ в стек. А так же добавляем в него состояние 7. |
$0i2(3i5,7i10,7 | i);$ | action[I7, i] = s10 Осуществляем перенос i в стек. А так же добавляем в него состояние 10. |
$0i2(3i5,7i10,7i10 | );$ | action[I10, )] = r5 Осуществляем свертку по правилу грамматики номер 5. Снимаем со стека 2*0 символов, добавляем в него сворачиваемый нетерминал, а так же состояние, которое указано в ячейке goto[I10,F] = 11 (10 – текущее состояние вершины стека) |
$0i2(3i5,7i10,7i10F11 | );$ | action[I11, )] = r4 Осуществляем свертку по правилу грамматики номер 4. Снимаем со стека 2*3 символов, добавляем в него сворачиваемый нетерминал, а так же состояние, которое указано в ячейке goto[I10,F] = 11 (10 – текущее состояние вершины стека) |
$0i2(3i5,7i10F11 | );$ | action[I11, )] = r4 Осуществляем свертку по правилу грамматики номер 4. Снимаем со стека 2*3 символов, добавляем в него сворачиваемый нетерминал, а так же состояние, которое указано в ячейке goto[I5,F] = 8 (5 – текущее состояние вершины стека) |
$0i2(3i5F8 | );$ | action[I8, )] = r2 Осуществляем свертку по правилу грамматики номер 2. Снимаем со стека 2*2 символов, добавляем в него сворачиваемый нетерминал, а так же состояние, которое указано в ячейке goto[I2,P] = 8 (2 – текущее состояние вершины стека) |
$0i2(3P4 | );$ | action[I4, )] = s6 Осуществляем перенос ‘)’ в стек. А так же добавляем в него состояние 6. |
$0i2(3P4)6 | ;$ | action[I6, ;] = s9 Осуществляем перенос ‘;’ в стек. А так же добавляем в него состояние 9. |
$0i2(3P4)6;9 | $ | action[I9, $] = r1 Осуществляем свертку по правилу грамматики номер 1. Снимаем со стека 2*5 символов, добавляем в него сворачиваемый нетерминал, а так же состояние, которое указано в ячейке goto[I0,D] = 1 (0 – текущее состояние вершины стека) |
$0D1 | $ | action[I1, $] = accept Попадаем в ячейку «accept». Строка успешно разобрана |
Пример 2. i();i
Стек | Входной поток | Комментарии |
$0 | i();i$ | action[I0, i] = s2 Осуществляем перенос i в стек. А так же добавляем в него состояние 2. |
$0i2 | ();i$ | action[I2, (] = s2 Осуществляем перенос ‘(‘ в стек. А так же добавляем в него состояние 3. |
$0i2(3 | );i$ | action[I3, )] = r3 Осуществляем свертку по правилу грамматики номер 3. Снимаем со стека 2*0 символов, добавляем в него сворачиваемый нетерминал, а так же состояние, которое указано в ячейке goto[I3,P] = 4 (3 – текущее состояние вершины стека) |
$0i2(3P4 | );i$ | action[I4, )] = s6 Осуществляем перенос ‘)‘ в стек. А так же добавляем в него состояние 6. |
$0i2(3P4)6 | ;i$ | action[I6, ;] = s9 Осуществляем перенос ‘;‘ в стек. А так же добавляем в него состояние 9. |
$0i2(3P4)6;9 | i$ | action[I9, i] = e8 Возникла ошибочная ситуация. В соответствии с правилом удаляем символ i из входного потока. |
$0i2(3P4)6;9 | $ | action[I9, $] = r1 Осуществляем свертку по правилу грамматики номер 1. Снимаем со стека 2*5 символов, добавляем в него сворачиваемый нетерминал, а так же состояние, которое указано в ячейке goto[I0,D] = 1 (0 – текущее состояние вершины стека) |
$0D1 | $ | action[I1, $] = accept Попадаем в ячейку «accept». Строка успешно разобрана |
Пример 3. ,i;
Стек | Входной поток | Комментарии |
$0 | ,i;$ | action[I0, ‘,’] = e1 Возникла ошибочная ситуация. В соответствии с правилом добавляем в стек символ i, а так же состояние 2. |
$0i2 | ,i;$ | action[I2, ‘,’] = e3 Возникла ошибочная ситуация. В соответствии с правилом добавляем в стек символ ‘(‘, а так же состояние 3. |
$0i2(3 | ,i;$ | action[I3, ‘,’] = e4 Возникла ошибочная ситуация. В соответствии с правилом удаляем из входного потока символ ‘,’. |
$0i2(3 | i;$ | action[I3, i] = s5 Осуществляем перенос i в стек. А так же добавляем в него состояние 5. |
$0i2(3i5 | ;$ | action[I5, ;] = e5 Возникла ошибочная ситуация. В соответствии с правилом добавляем в стек символ ‘)‘, а так же состояние 6. |
$0i2(3i5)6 | ;$ | action[I6, ;] = s9 Осуществляем перенос ‘;’ в стек. А так же добавляем в него состояние 59. |
$0i2(3i5)6;9 | $ | action[I9, $] = r1 Осуществляем свертку по правилу грамматики номер 1. Снимаем со стека 2*5 символов, добавляем в него сворачиваемый нетерминал, а так же состояние, которое указано в ячейке goto[I0,D] = 1 (0 – текущее состояние вершины стека) |
$0D1 | $ | action[I1, $] = accept Попадаем в ячейку «accept». Строка успешно разобрана |
Задача «Построение операторной грамматики»
Теоретическая часть: