2017-12-01 3 views
-1

Ich lernte LR-Parser-Konflikt, wenn (Verschiebung vs reduzieren) und (reduzieren vs reduzieren). Wenn (shift vs reduce) Konflikt, führen Sie Verschiebung. Wenn (Konflikt reduzieren oder reduzieren) Konflikt, erste Produktionsregel durchführen.Wie Lösen von Mehrdeutigkeit und Konflikten LR-Parser?

warum das ?? Warum Schicht und erste Produktionsregel wählen ??

+1

Diese Frage wird ausführlich in Kapitel 4 des Drachenbuchs mit realen Beispielen diskutiert. – rici

Antwort

0

Zuerst einfach: Reduzieren-reduzieren-Konflikte sind in der Regel schlecht. Parser-Generatoren, mit denen Sie durchkommen können, verwenden eine konsistente Regel wie "Nehmen Sie die erste", so dass Sie wählen können, welche Sie möchten, indem Sie die Regeln in Ihrer Grammatik neu anordnen.

Shift-Reduce-Konflikte sind eigentlich ziemlich häufig. Der Parser-Generator wählt die Verschiebung in diesen Fällen, weil es fast immer das ist, was Sie wollen. Das klassische Beispiel ist ein Satz wie:

if (A) if (B) C else D; 

In einer LR-Grammatik, die dies ermöglicht, ist in der Regel ein shift-reduce-Konflikt auf dem „anderen“, und seinem mehrdeutigen die „if“ es gilt. Die Auswahl der Verschiebung bedeutet, dass sie auf das "if (B)" angewendet wird, was normalerweise die Regel in Sprachen ist, die solche Dinge erlauben.

Verwandte Themen