Однако, в ряде ситуаций описанный способ разрешения
Конфликтов приводит к нужному результату. Например, рассмот-
Рим фрагмент грамматики языка программирования, описывающий
условный оператор:
оператор: if '(' условие ')' оператор /*1*/
|
if '(' условие ')' оператор else
оператор; /*2*/
Входная строка вида:
If(C1) if(C2) S1 else S2
вызвала бы при разборе конфликт сдвиг/свертка в момент
- 22 -
Просмотра символа else. Введенная часть строки к этому вре-
мени имеет вид:
If (условие) if (условие) оператор
Если выполнить свертку второй части конструкции по правилу
(1), то строка сведется к:
If (условие) оператор
(Заметим, что применить еще раз правило(1) мешает просмот-
Ренный заранее символ else). После ввода конструкции S2 и
замены ее нетерминалом оператор к строке:
If (условие) оператор else оператор
Будет применено правило (2). Полученный разбор соответствует
следующей интерпретации входной строки:
if (C1) {if(C2) S1} else S2
При альтернативном подходе в случае применения сдвига в
Момент появления else входная строка была бы введена пол-
ностью:
If (условие) if (условие) оператор
Else оператор
Ко второй части строки можно применить правило (2), а затем
свернуть полученную конструкцию:
If (условие) оператор
По правилу (1). Такой разбор соответствует второй возможной
интерпретации входной строки:
if (C1) {if(C2) S1 else S2}
Как известно, в большинстве языков программирования принята
Не нашли, что искали? Воспользуйтесь поиском:
|