Если язык имеет грамматику LR(k)
, то у него есть грамматика LR(1)
, которая может быть сгенерирована механически из грамматики LR(k)
; кроме того, исходное дерево разбора можно воссоздать из дерева разбора LR(1)
. Доказательство этой теоремы появилось в разделе 6.7 теории парсинга. II, Sippu & Soisalon-Soininen; они приписывают его «О полной проблеме покрытия для грамматик LR (k)» (1976), MD Mickunas, в JACM 23: 17-30.
Так что нет никакого языка распознаваем, как LR(k)
для k>1
, который также не является распознаваем, как LR(1)
, и, следовательно, на самом деле не такие, как вещь, как LR(k)
языка для значений k
, кроме 0 и 1.
Однако существуют языки, для которых грамматика LR(2)
намного проще. Один классический пример - грамматика Posix для yacc
, которая не требует прекращения производства с помощью ;
. Это однозначно, потому что производство должно начинаться с идентификатора, за которым следует двоеточие. Написанный таким образом, грамматика явно LR(2)
; по вышеуказанной теореме существует грамматика LR(1)
, но она нигде не близка к чистоте.
Интересно, я знал, что вы можете генерировать грамматику LR (1) механически, но я не знал, что вы также восстанавливаете дерево разбора механически! +1 – Mehrdad
Знаете ли вы, есть ли более простое описание того, как восстановить все дерево разбора где-нибудь (кроме ссылки на бумагу/книгу, к которой вы привязались)? Преобразование грамматики, вероятно, возможно, но я не могу себе представить, как вы можете восстановить дерево разбора без эффективного создания общего анализатора LR (k) в процессе ... – Mehrdad
@mehrdad: У меня есть копия Sippu & Soisalen-Soininen впереди из меня, но это не очень помогает вам :(Это, однако, означает, что я никогда не потрудился найти другой источник для этой теоремы. У вас есть академическая библиотека поблизости, возможно? – rici