2016-03-25 11 views
0

Auf der Grammatik einer .y (yacc - Bison) zu tun Datei Ich habe definiert die folgenden Regeln:Bison: Shift/Konfliktlösung reduzieren, wenn sie mit optionalen Regeln

C: E | D | F | A

A: B | B '[' C ']';

(so etwas wie B mit optionaler [C] ist) , wenn ich die .y-Datei in der entsprechenden Weise kompilieren eine richtige Lexer-Datei ich die folgende Verschiebung erhalten \ reduzieren Konflikt:

Zustand 48
74 A: B.
75 | B. '[' C ']'
'[' Verschiebung und gehe in den Zustand 91
'[' [reduzieren mit Regel 74 (A)]
$ Standard reduzieren mit Regel 74 (A)

Mein Problem ist folgendes, wenn es den Vorgänger '[' Ich möchte es verschieben und nicht reduzieren. Das Problem ist, dass ich die Lösung für diesen Fehler nicht finden kann, während ich Stunden in der Dokumentation suche. Wie kann ich das beheben (bitte Code-spezifisch sein).

+1

Sie haben nicht genügend Informationen geliefert Ihre Fehler zu reproduzieren:

Sie können die in der Regel durch (unter der Annahme, B und C sind Tokens) ersetzen. Wenn ich aus Ihrem Beispiel eine Bison-Datei erstelle, finde ich keine Probleme. Zeigen Sie mehr Code, der Ihren Fehler reproduziert. –

Antwort

1

Das Problem ist, dass es einen Kontext gibt, in dem ein A von einem gefolgt werden kann. Ohne mehr Grammatik zu sehen, ist es unmöglich, genauer zu sein.

Es ist jedoch erwähnenswert, dass Bison/Yacc genau das tun wird, was Sie wollen: den Konflikt zugunsten der Verschiebung lösen. Abgesehen von der Warnung sollte also alles in Ordnung sein.

0

Wenn Sie versuchen, die eine Regel zu erweitern, erhalten Sie zwei mögliche Zustände

Zustand 1:

A -> B 

Zustand 2:

A -> B 
A -> BC 

Alle möglichen Zustände für A sind die folgenden

A -> B (State 1) 
A -> B (State 2) 
A -> BC 

Bison kann nicht feststellen, ob Sie sich im Status 1 oder 2 für den B-Eingang befinden.

A: B | B C