Пример грамматики LR, которая не может быть представлена ​​LL?

Все грамматики LL являются грамматиками LR, но не наоборот, но я все еще изо всех сил пытаюсь разобраться с различием. Мне любопытно, какие маленькие примеры, если таковые существуют, из LR-грамматик, которые не имеют эквивалентного представления LL.

Ответы

Ответ 1

Хорошо, что касается грамматик, то его простая - простая левая рекурсивная грамматика - LR (вероятно, LR (1)), а не LL. Итак, грамматика списка вроде:

list ::= list ',' element | element

- LR (1) (при условии, что для элемента есть произведение), но не LL. Такие грамматики можно довольно легко преобразовать в грамматики LL с помощью левого факторинга и т.д., Поэтому это не слишком интересно.

Более интересны ЯЗЫКИ, которые являются LR, но не LL - это язык, для которого существует грамматика LR (1), но не LL (k) для любого k. Примером могут быть вещи, которые нуждаются в необязательных совпадениях. Например, язык любого числа символов a, за которым следует одно и то же число или меньше символов b, но не более b - {a ^ я b ^ j | я >= j}. Там тривиальная грамматика LR (1):

S ::= a S | P
P ::= a P b | \epsilon

но не LL (k) грамматика. Причина в том, что грамматика LL должна решить, следует ли сопоставлять пару a + b или нечетное a при просмотре a, тогда как грамматика LR может отложить это решение до тех пор, пока не увидит b или конец ввода.

В этом сообщении на cs.stackechange.com есть много ссылок об этом