Фильтр y.output из бизонов или yacc? - PullRequest
3 голосов
/ 27 февраля 2010

Я использую бизона, и сложно понять конфликты, посмотрев на y.output.Есть ли инструмент для создания или фильтрации y.output, чтобы он был более полезным?Я бы хотел увидеть полный путь к государству с конфликтом, но мне бы хотелось что-нибудь полезное.

1 Ответ

1 голос
/ 02 апреля 2010

Я предполагаю, что вы знаете, что такое сдвиг / уменьшение и уменьшение / уменьшение конфликтов и когда они возникают. Учитывая это, я просто использовал vim ...

В верхней части y.output перечислены списки состояний, в которых есть сколько конфликтов. Если вы просто наберете «/ statenumber» и нажмете «n» пару раз, вы сможете сразу перейти к переходам для этого состояния.

Там вы увидите производственные правила, которые вы ввели с помощью '.' в них. Точка указывает место в производственном правиле, до которого оно было проанализировано. Если точка находится в конце, это означает, что она попытается «уменьшить», а если нет, «сдвинуть». Сокращение производства происходит, если следующий токен находится в FOLLOWSET нетерминала LHS (следующий токен является символом, который может следовать за этим нетерминалом), и происходит сдвиг для терминала или FIRST (нетерминала), который является после '.'.

Конфликт возникает, если у вас есть два возможных хода (сдвиг / уменьшение или уменьшение / уменьшение) для возможного следующего токена.

Когда вы обнаружите конфликты, просто перейдите в это состояние, выясните, какие производственные правила дают вам конфликт, и либо: a - измените свою грамматику, чтобы удалить этот конфликт, либо b - укажите приоритет производственного правила, используя% предварительная запись.

Надеюсь, что помогло:)

...