Фильтровать y.output от bison или yacc?

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


person Community    schedule 27.02.2010    source источник


Ответы (1)


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

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

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

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

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

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

person Vanwaril    schedule 02.04.2010