Conflicten: `shift/reduce', `reduce/reduce'Steeds als YACC je waarschuwt over conflicten, kun je problemen verwachten.Het oplossen van deze conflicten schijnt iets van een kunstvorm te zijn die je een hoop over je taal kan leren. Misschien meer dan je wilde weten.De problemen draaien om de vraag hoe een reeks tokens te interpreteren. Laten we aannemen dat we een taal hebben die deze commando's moet accepteren: verwijder verwarming all verwijder verwarming number1Hiertoe definiëren we deze grammatica: delete_heaters: TOKDELETE TOKVERWARMING mode { deleteheaters($3); } mode: WOORD delete_a_heater: TOKDELETE TOKVERWARMING WOORD { delete($3); }Je ruikt misschien al moeilijkheden. De toestandsmachine begint met het woord `verwijder' te lezen, en moet dan op basis van het volgende token beslissen waar naartoe te gaan. Dit volgende token kan een mode zijn, die aangeeft hoe de verwarmingen te verwijderen, of de naam van een verwarming die te verwijderen is.Het probleem is dat het volgende token in beide gevallen een WOORD is. YACC weet dus niet wat het moet doen. Dit leidt tot een `reduce/reduce' waarschuwing, en een waarschuwing dat de `delete_a_heater' node nooit bereikt zal worden.In dit geval is het conflict gemakkelijk opgelost (door het eerste commando te hernoemen tot `verwijder verwarmingen all' of door `all' een apart token te maken), maar soms is het moeilijker. Het y.output bestand dat gegenereerd wordt als je YACC de --verbose vlag geeft kan enorm helpen.