У меня есть есть подозрение, что С++ и многие другие грамматики на LR(1) вообще никак.
Преимущество LR(1) над там же packrat, который может в наверное почти любые CFG (и даже леворекурсивные, с определёнными хаками) грамматики в том, что в LR(1) конфликты надо разрешать явно, а пакрат/PEG делают это автоматически. И то, что тебя LR заставит разруливать сразу, в пакрате вылезет потом.
В LR(1) "разрешение конфликтов" выглядит так: если в одном и том же верхнем состоянии (наборе продукций) появляется несколько действий на 1 токен, и они отличаются только lookahead'ом (Reduce (A -> a B c . / {e d}
& Reduce (A -> a B c . / {f e}
при следующем символе e
), то мы их мержим (Reduce (A -> a B c . / {e d f}
), иначе это конфликт.
Судя по всему, LR(1) является наибольшим формализмом для описания однозначных грамматик. Если у тебя вылез конфликт, то это потому, что информации в грамматике не хватило на однозначное решение.
PEG, строго говоря, вообще "не может в грамматики", опять-таки — он "внешне похож" на них, вот и всё.
> а пакрат/PEG делают это автоматически.
Да, лечение головной боли путём отрубания головы, очень удобно. ;)
> Судя по всему, LR(1) является наибольшим формализмом для описания однозначных грамматик.
А LR(k) к ним приводятся (подсмотрел). ;) Может, есть и ещё подобные классы грамматик, но я о них не знаю.