Я предполагаю, что вы знаете, что такое сдвиг / уменьшение и уменьшение / уменьшение конфликтов и когда они возникают. Учитывая это, я просто использовал vim ...
В верхней части y.output перечислены списки состояний, в которых есть сколько конфликтов. Если вы просто наберете «/ statenumber» и нажмете «n» пару раз, вы сможете сразу перейти к переходам для этого состояния.
Там вы увидите производственные правила, которые вы ввели с помощью '.' в них. Точка указывает место в производственном правиле, до которого оно было проанализировано. Если точка находится в конце, это означает, что она попытается «уменьшить», а если нет, «сдвинуть». Сокращение производства происходит, если следующий токен находится в FOLLOWSET нетерминала LHS (следующий токен является символом, который может следовать за этим нетерминалом), и происходит сдвиг для терминала или FIRST (нетерминала), который является после '.'.
Конфликт возникает, если у вас есть два возможных хода (сдвиг / уменьшение или уменьшение / уменьшение) для возможного следующего токена.
Когда вы обнаружите конфликты, просто перейдите в это состояние, выясните, какие производственные правила дают вам конфликт, и либо: a - измените свою грамматику, чтобы удалить этот конфликт, либо b - укажите приоритет производственного правила, используя% предварительная запись.
Надеюсь, что помогло:)