Я использую bison, и мне трудно понять конфликты, глядя на y.output. Есть ли инструмент для создания или фильтрации y.output, чтобы он был более полезным? Я хотел бы увидеть полный путь к состоянию с конфликтом, но мне бы хотелось чего-нибудь полезного.
Фильтровать y.output от bison или yacc?
Ответы (1)
Я предполагаю, что вы знаете, что такое конфликты сдвига/уменьшения и уменьшения/уменьшения и когда они возникают. Учитывая это, я просто использовал vim...
В верхней части y.output указано, в каких состояниях и сколько конфликтов. Если вы просто наберете «/statenumber» и пару раз нажмете «n», вы сможете сразу перейти к переходам для этого состояния.
Там вы увидите правила производства, которые вы ввели с помощью '.' в них. Точка указывает место в продукционном правиле, до которого он проанализировал. Если точка стоит в конце, это означает, что будет предпринята попытка «уменьшить», а если нет, то «сдвинуть». Производство сокращения происходит, если следующая лексема находится в FOLLOWSET нетерминала LHS (следующая лексема — это символ, который может следовать за этим нетерминалом), и сдвиг происходит для терминала или ПЕРВОГО (нетерминала), который является после '.'.
Конфликт возникает, если у вас есть два возможных хода (сдвиг/уменьшение или уменьшение/уменьшение) для возможного следующего токена.
Когда вы обнаружите конфликты, просто перейдите в это состояние, выясните, какие производственные правила вызывают конфликт, и либо: а — измените грамматику, чтобы устранить этот конфликт, либо б — укажите приоритет производственных правил, используя нотацию %prec.
Надеюсь, это помогло :)