2016-03-21 12 views
0

Wenn ich eine Grammatik habe, wo ein bestimmter Ausdruck zwei Produktionen zusammenbringen kann, werde ich offensichtlich einen Konflikt mit yacc reduzieren/reduzieren. Genauer gesagt, ich habe zwei Produktionen (FirstProduction und SecondProduction), wo beide TOKEN END sein könnten.Lösen eines Konflikts reduzieren/reduzieren

Dann wird yacc nicht in der Lage sein zu wissen, was TOKEN END zu (FirstProduction oder SecondProduction) zu reduzieren. Allerdings möchte ich es so machen, dass yacc FirstProduction in dieser Situation priorisiert. Wie kann ich das erreichen?

Beachten Sie, dass sowohl FirstProduction als auch SecondProduction eine Menge Dinge sein können und dass Body der einzige Ort in der Grammatik ist, wo diese Konflikte.

Auch ich weiß, dass YACC in diesen Situationen die erste Produktion auswählen wird, die in der Grammatik deklariert wurde. Ich möchte jedoch verhindern, dass Warnungen reduziert/reduziert werden.

+1

Sie meinen 'Körper: FirstProduction | SecondProduction', oder? – rici

+0

Ich habe es bearbeitet, um anzuzeigen, dass Body eine Liste von FirstProductions oder eine Liste von SecondProductions sein kann (eine Liste von 0 oder mehr Instanzen der ersten oder zweiten Produktion). Auf diese Weise meinte ich nicht, was du gesagt hast, sondern stattdessen, was ich gesagt habe (wenn auch bearbeitet), sicher. –

Antwort

1

Sie können die Grammatik Refactoring nicht die zweite Liste erlauben, mit etwas zu beginnen, die Teil der ersten Liste sein könnte:

Body: FirstProductionList SecondProductionList 
    | FirstProductionList 
    ; 

FirstProductionList: FirstProductionList FirstProduction 
        | /* empty */ 
        ; 

SecondProductionList: SecondProductionList SecondProduction 
        | NonFirstProduction 
        ; 

NonFirstProduction ist jede Produktion, die SecondProduction einzigartig ist, und markiert den Übergang von Reduzieren FirstProdution s zu SecondProduction s

1

Bison hat keine Möglichkeit, eine Produktion als bevorzugt gegenüber einer anderen zu kennzeichnen; Der einzige derartige Mechanismus sind Präzedenzbeziehungen, die Konflikte zwischen Verschiebung und Reduzierung auflösen. Wie Sie sagen, bietet die Reihenfolge der Dateien eine implizite Priorität. Sie können die Warnung mit einer %expect Deklaration unterdrücken; Leider können Sie Bison nur sagen, wie viele Konflikte zu erwarten sind und nicht welche Konflikte.