Ich lerne gerade über Compiler und wie ich in LR (0) verstehe, gibt es Fälle, in denen wir "shift/reduce" oder "reduce/reduce" -Konflikte haben, aber "Shift/Shift" -Konflikte sind unmöglich! Warum können wir keinen "Shift/Shift" -Konflikt haben?Warum kann ein Compiler keinen "Shift/Shift" -Konflikt haben?
Antwort
Verschiebungs-/Reduzierungskonflikte treten auf, wenn der Parser nicht unterscheiden kann, ob verschoben werden soll (das nächste Eingabetoken auf dem Parsingstapel drücken) oder reduzieren (eine Folge von Terminals und Nichtterminals aus dem Parsingstack entfernen). Ein Reduzierungs-/Reduzierungskonflikt liegt vor, wenn der Parser zu reduzieren weiß, aber nicht sagen kann, welche Reduktion ausgeführt werden soll.
Wenn Sie einen Shift/Shift-Konflikt hätten, würde der Parser wissen, dass er das nächste Token auf seinen Parsing-Stack schieben musste, aber nicht wissen würde, wie es geht. Da es nur eine Möglichkeit gibt, das Token auf den Parsing-Stack zu schieben, kann es in der Regel keine Konflikte dieser Form geben.
Das heißt, es ist theoretisch möglich, dass ein Shift/Shift-Konflikt existiert, wenn Sie ein seltsames Setup hatten, in dem zwei oder mehr Übergänge aus einem Parsing-Zustand mit demselben Terminal-Symbol hervorgingen. Der Konflikt wäre in diesem Fall, ob man sich verschiebt und zu einem Staat geht oder wechselt und zum nächsten geht. Dies könnte passieren, wenn Sie versucht haben, einen Automaten in weniger Zustände zu komprimieren und dies falsch gemacht haben oder wenn Sie versucht haben, einen nichtdeterministischen Parsing-Automaten zu erstellen. In der Praxis würde dies niemals passieren.
Hoffe, das hilft!
Der dritte Absatz ist sehr nützlich, danke! – alcuadrado
- 1. Haben Compiler
- 2. Wie Compiler Enum Neudeklaration Konflikt
- 3. Warum haben C++ - Compiler obskure Fehlermeldungen
- 4. Warum eine explizite Schnittstellenmemberimplementierung, haben keinen Modifikator
- 5. Warum haben wir keinen // Kommentar in CSS?
- 6. Nicht-Mitgliedsfunktionsoperator + (...) kann keinen cv-Qualifier haben
- 7. Kann eine Klasse keinen Konstruktor haben?
- 8. qtcreator verwendet keinen angegebenen Compiler
- 9. Warum Literalwert hat keinen Typ?
- 10. Compiler keinen Fehler ausgelöst, wenn ein Objekt aus einem Protokoll
- 11. Warum kann mein flask-pagedown keinen Zeilenumbruch haben, warum schreibe ich Code von Markdown?
- 12. Warum kann ein Compiler die Methode nicht außer Kraft setzen?
- 13. Warum kann ein std :: vector keinen lokalen Typ annehmen?
- 14. Warum kann ein Razor-Helfer keinen anderen Helfer rufen?
- 15. Warum kann ein DataMember in WCF keinen Type zurückgeben?
- 16. Warum kann RVM nach der Installation von XCode keinen Compiler und kein 'Make' Tool finden?
- 17. Ant-Build funktioniert nicht: Ich kann keinen Javac-Compiler finden
- 18. Warum Scala hat keinen Deklinktyp?
- 19. Warum hat ein Tuple oder ein KeyValueItem keinen Setter?
- 20. Warum kann ich keinen OData-Service erstellen?
- 21. Warum kann ich keinen Blog hinzufügen?
- 22. Links haben keinen Hover-Effekt
- 23. Warum sollte ein Compiler diese Assembly generieren?
- 24. Warum kann ich keinen Primärschlüssel referenzieren?
- 25. Welche C-Compiler haben Zeiger-Subtraktionsunterläufe?
- 26. Warum kann Compiler Callback nicht konvertieren?
- 27. Warum Compiler Fehler beim Build?
- 28. Warum haben OOP-Sprachen keinen Zugriffsmodifizierer, der nur gelesen werden kann?
- 29. Warum kann ich keinen Cookie löschen?
- 30. Warum kann ich keinen Text schreiben?
Es gibt reduce-reduce-Konflikte, weil es 2 Produktionen gibt, die ausgewählt werden können, um das Handle zu reduzieren. Es gibt Shift-Reduce-Konflikte, weil Sie mit etwas Produktion sowohl verschieben als auch reduzieren können und das Parsing offensichtlich immer noch vorwärts bringen. Shift bedeutet nur 1 Sache, du bringst den Input-Stream voran, es kann also keinen Shift-Shift-Konflikt geben. – axiom