Опубликован: 23.07.2006 | Доступ: свободный | Студентов: 2218 / 892 | Оценка: 4.28 / 4.17 | Длительность: 21:37:00
Специальности: Системный архитектор
Лекция 7:

Восходящие анализаторы

Неоднозначные грамматики. Приоритет операций

Пример.Рассмотрим грамматику G3

(1) E -> id
(2) E -> num
(3) E -> E*E
(4) E -> E+E

Рассмотрим процесс анализа входной цепочки 2*3+4 .

Содержимое стека Необработанная часть входной цепочки Действие
$ 2*3+4 shift
$2 *3+4 reduce [2]
$E *3+4 shift
$E* 3+4 shift
$E*3 +4 reduce [2]
$E*E +4 shift

После выполнения последнего описанного шага возникают две альтернативы: либо (а) произвести свертку последовательности, находящейся на вершине стека, используя правило 3, либо (б) произвести перенос символа + на вершину стека. Так как приоритет умножения больше приоритета сложения, следует сделать свертку. Однако, это противоречит общему правилу, согласно которому, в случае конфликта перенос-свертка, перенос является предпочтительной операцией (которое было таким удобным способом разрешить конфликт в первом случае).

В данной ситуации существует эквивалентная грамматика G 4 , в которой цепочка 2*3+4 имеет единственный вывод:

(1) E -> E+T
(2) E -> T
(3) T -> T*F
(4) T -> F
(5) F -> id
(6) F -> num

Неоднозначные грамматики. Ассоциативность

Рассмотрим конфигурации, возникающие при анализе строки 1+2+3 .

Содержимое стека Необработанная часть входной цепочки Действие
$ 1+2+3 Shift
$1 +2+3 Reduce [2]
$E +2+3 Shift
$E+ 2+3 Shift
$E+2 +3

После последнего шага возникает конфликт перенос-свертка. Выбор переноса делает сложение правоассоциативным, выбор свертки - левоассоциативным. Так как левоассоциативное сложение более естественно, свертка предпочтительна. В данном случае не существует эквивалентной однозначной грамматики. Формализма грамматик не хватает для описания данной ситуации и необходимы дополнительные средства.

Таким образом, существуют ряд стандартных ситуаций, в которых возникают неоднозначные грамматики. Большая часть подобных ситуаций может быть решена преобразованием грамматик ("висящие" else , приоритет операций и т.д.), но не всегда это необходимо ("висящие" else ) и не всегда является лучшим решением. Существуют ситуации, когда подходящее преобразование грамматики не существует, в таких случаях необходимо привлекать дополнительные механизмы, как это сделано, например, для определения ассоциативности операций.

Литература к лекции

  • А. Ахо, Р. Сети, Дж. Ульман "Компиляторы: принципы, технологии и инструменты", М.: "Вильямс", 2001, 768 стр.
  • D. Grune, C. H. J. Jacobs "Parsing Techniques - A Practical Guide", Ellis Horwood, 1990, 320 pp.