У меня есть есть подозрение, что С++ и многие другие грамматики на 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) является наибольшим формализмом для описания однозначных грамматик. Если у тебя вылез конфликт, то это потому, что информации в грамматике не хватило на однозначное решение.