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.