Восходящие анализаторы
Неоднозначные грамматики. Приоритет операций
Пример.Рассмотрим грамматику G3
Рассмотрим процесс анализа входной цепочки 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+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.