Attualmente sto studiando i compilatori e, come ho capito in LR (0), ci sono casi in cui abbiamo conflitti "shift/reduce" o "reduce/riduci", ma è impossibile avere conflitti "shift/shift"! Perché non possiamo avere un conflitto "turno/turno"?Perché un compilatore non può avere un conflitto di "shift/shift"?
risposta
I conflitti di spostamento/riduzione si verificano quando il parser non è in grado di dire se spostare (premere il successivo token di input in cima allo stack di analisi) o ridurre (inserire una serie di terminali e non terminali dallo stack di analisi). Un conflitto di riduzione/riduzione è quando il parser sa ridurre, ma non può dire quale riduzione eseguire.
Se si dovesse avere un conflitto di maiusc/shift, il parser saprebbe che era necessario spingere il token successivo nel proprio stack di analisi, ma non avrebbe saputo come farlo. Poiché esiste un solo modo per spingere il token nello stack di analisi, generalmente non possono esserci conflitti di questo modulo.
Detto questo, è teoricamente possibile che si verifichi un conflitto di maiusc/shift se si dispone di una strana configurazione in cui sono presenti due o più transizioni che conducono da uno stato di analisi specificato con lo stesso simbolo di terminale. Il conflitto in quel caso sarebbe se spostarsi e andare in uno stato o spostarsi e andare in un altro. Questo potrebbe accadere se si provasse a comprimere un automa in un numero inferiore di stati e lo si fosse verificato in modo errato o se si stesse tentando di creare un automa di analisi non deterministico. In pratica, questo non succederebbe mai.
Spero che questo aiuti!
Il terzo paragrafo è molto utile, grazie! – alcuadrado
- 1. Perché FacesServlet non può avere un modello URL di/*.?
- 2. Perché c'è un conflitto di moduli?
- 3. Perché si verifica un conflitto di unione?
- 4. Un file CSV può avere un commento?
- 5. Un delegato può avere un parametro opzionale?
- 6. Un compilatore ANSI C può rimuovere un ciclo di ritardo?
- 7. Perché il compilatore Java non può inferire correttamente l'ereditarietà?
- 8. Un ascoltatore di eventi può avere un solo abbonato?
- 9. Perché il compilatore si lamenta di non essere un constexpr?
- 10. Perché si può avere una virgola alla fine di un inizializzatore della raccolta?
- 11. Quando un compilatore può dedurre un parametro di modello?
- 12. Un compilatore ottimizzante può aggiungere std :: move?
- 13. Se clang è il front-end di un compilatore, allora perché può produrre un file eseguibile?
- 14. Perché il compilatore non può ottimizzare std :: string concat?
- 15. Quando un compilatore non può utilizzare RVO o NRVO?
- 16. Un widget di casa può avere un contesto?
- 17. Un ramo GIT può avere un sottoinsieme di dati?
- 18. Perché una classe può avere un membro statico di se stesso, ma non un membro non statico?
- 19. Perché il compilatore non può ottimizzare questi 2 estratti?
- 20. Un envo java può avere più di un costruttore?
- 21. Un modulo può avere un proprio file di configurazione?
- 22. Perché System.Array non può essere un vincolo di tipo?
- 23. Perché Rust non può dedurre la durata corretta in chiusure semplici, o perché sono in conflitto?
- 24. Un DFA può avere transizioni epsilon/lambda?
- 25. Perché PriorityQueue in Java non può avere initialCapacity 0?
- 26. Un array variante può avere 0 elementi?
- 27. Un set può avere elementi duplicati?
- 28. Non può essere sigillato perché non è un override
- 29. Perché non il compilatore C# prendere un InvalidCastException
- 30. Swift: come può un superlayer non avere sottolivelli?
Esistono conflitti di riduzione e riduzione perché sono due produzioni che possono essere scelte per ridurre l'handle. Ci sono conflitti di riduzione del turno perché è possibile spostare e ridurre con un po 'di produzione e apparentemente continuare a fare il parsing. Maiuscolo significa solo 1 cosa, si avanza il flusso di input, quindi non ci può essere un conflitto di turno. – axiom