Esiste un algoritmo standardizzato o ampiamente accettato per il recupero degli operatori in shift / riduzione dei conflitti nel parser LALR? La domanda è ingenua, il mio problema non è con l'implementazione della mia soluzione, ma l'implementazione della soluzione è già ampiamente utilizzata.
Per spostare l'operatore è il prossimo token di input, per ridurlo dipende da: considero tutti i simboli già letti (per una data produzione) dichiarati come operatori:
- se ce n'è uno - è l'operatore
- se ce ne sono più di uno - riporto l'errore grammaticale
- se non ce n'è nessuno, uso il token di input come operatore
Quindi ad esempio:
E ::= E + E
E ::= E * E
E ::= num
in caso di
E + E | * num
Considerando la prima produzione ho letto +
, e poiché è l'unico operatore a leggere, scelgo questo per ridurre l'operatore. *
è il primo token in input, quindi server come operatore di spostamento.
Ma il mio algoritmo è corretto (cioè lo stesso di quello usato normalmente per i parser LALR)? Sono particolarmente preoccupato per il punto in cui ho più di 1 operatore nei token di lettura.
Aggiornamento
Che cosa NON sto chiedendo qui
Non chiedo come risolvere lo shift / ridurre il conflitto una volta che hai gli operatori. Non chiedo come impostare la precedenza per gli operatori.
Cosa ho am chiedendo qui
Chiedo come estrarre gli operatori dal "flusso" di token. Diciamo che l'utente imposta alcune regole di precedenza per +
, -
e *
. Lo stack è: -
E
+
E
e l'input è E
. Oppure lo stack è E
e l'input è *
.
Qual è l'operatore da ridurre nel primo caso? E nel secondo? Perché?
Lo stack è davvero tutto a destra della produzione.