Каждая грамматика LR (0) является SLR (1), но, наоборот, не обязательно должна быть истинной, почему? - PullRequest
2 голосов
/ 14 ноября 2010

Каждая грамматика LR (0) является SLR (1), но, наоборот, не обязательно должна быть истинной, почему?

1 Ответ

4 голосов
/ 14 ноября 2010

По существу, грамматика SLR (1) может разрешать конфликты смещения-сдвига, которые существуют в соответствующей грамматике LR (0). Возьмите пример грамматики на странице SLR парсера Википедии (которая объясняет это на более низком, более строгом уровне):

  1. S → E
  2. E → 1 E
  3. E → 1

Когда синтаксический анализатор LR (0) анализирует E , а "1" - следующий входной символ, он может распознать E и уменьшить (правило 3), или он может сдвиг, чтобы разобрать следующую E (правило 2). Поскольку он не может смотреть в будущее, LR (0) не может определить, что делать. Это станет более очевидным, если мы посмотрим на items , которые LR (0) может обрабатывать, когда встречает «1» (добавлен символ конца строки):

  • E → 1 • E $
  • E → 1 • $

Для первого потребуется сдвиг, для второго - уменьшение.

С помощью приведенной выше грамматики SLR (1) может смотреть вперед на один символ и определять, какое действие предпринять. E может сопровождаться только $, поэтому действие сокращения действует только в конце строки. Это соответствует второму элементу, где вы можете увидеть следующий символ «$».

Другой пример грамматики SLR (1), а не LR (0), см. В примечаниях Fegaras для CSE 5317/4305 в Техасском университете.

...