Di recente mi sono imbattuto in un documento che descrive la tecnica di analisi menzionata nel titolo. Sfortunatamente, la terminologia usata in questo documento va oltre la mia comprensione, quindi ho cercato di afferrare l'algoritmo di costruzione in modo più intuitivo. Credo di esserci riuscito ( questa presentazione è stata la fonte del momento ah-ah), ma una verifica della correttezza da parte di qualcuno che abbia familiarità con la tecnica o la terminologia in essa contenuta sarebbe molto apprezzata.
Descriverò la mia opinione sulla soluzione (se è corretta, credo che potrebbe essere di aiuto ad altre persone che tentano di comprendere la tecnica) e successivamente porterò ulteriori domande. Per garantire non c'è equivoco, ho intenzione di utilizzare la seguente notazione standard: , A , B , C , . . . ∈ N , . . . X , Y , Z ∈ N ∪ T , α , β e, come nel documento, A i → ω per indicare il numero della regola i . Tuttavia, probabilmente userò nomi diversi per concetti rispetto al documento originale.
Inoltre, in tutta la descrizione, viene utilizzata la relazione di equivalenza .
Costruzione
Esistono due tipi di elementi all'interno dell'automa di analisi: elementi LR semplici (0) del modulo che chiamo elementi shift e elementi del modulo A i → α ∙ β , m , n che chiamo risolve articoli ; questi dicono al parser di respingere n simboli indietro nel flusso di input e quindi ridurre di numero regola m sul primo simbolo di β .
La grammatica viene aumentata con la regola e la costruzione inizia con l'elemento di spostamento S ′ 0 → ∙ S $ nello stato iniziale.
Ora, per costruire l'automa, decidere tra queste alternative per ogni elemento in uno stato :
Se l'elemento è un elemento a turni , ci sarà una transizione q X → q ′ nell'automa, dove X è il primo simbolo di β .
Se l'oggetto è un articolo a turni finito , aggiungi un articolo di risoluzione B j → α A ∙ β , i , 0 per ogni regola B j → α A β .
Se l'elemento è un articolo di risoluzione , lascia che X sia il primo simbolo di β . Se X ∈ N , aggiungi un elemento di spostamento X j → ∙ ω per ogni regola X j → ω . Se altri elementi diversi da A i → α ∙ β , m , n hanno X come punto di riferimento del punto, aggiungi una transizione q X → q ′all'automa. Ogni elemento di risoluzione in q si tradurrà in un elemento di risoluzione C i → α X ∙ β , m , n + 1 in q ′ .
Se l'elemento è un elemento di risoluzione non fornirà alcuna informazione di lookahead e può essere scartato, ma prima aggiungi un elemento di risoluzione B j → α A ∙ β , m , n per ogni regola B j → α A β .
Questo è, ovviamente, solo uno schizzo; in realtà, una chiusura dello stato deve essere calcolata per prima e solo allora possiamo occuparci di transizioni / turni e risoluzioni.
Trasformare l'automa in una tabella di analisi a turni è in seguito banale; solo, come una variazione minore, gli autori dell'articolo interpretano una risoluzione come l'azione di accettazione. Dato l'automa risultante, ho trovato più semplice trattare uno spostamento di $ come azione di accettazione.
Domande
Il primo è, ovviamente, se il processo sopra descritto è corretto.
Il secondo riguarda le relazioni di equivalenza. Posso solo supporre che la relazione di equivalenza sia responsabile di decidere quali elementi di risoluzione vengono introdotti quando viene visto un elemento di turno finito. κ 0 sembra dare risultati sorprendentemente simili ai set di parser LSLR F O L L O W L M. L'articolo descrive una "relazione di equivalenza più fine" a pagina 11; c'è un modo per interpretare questa relazione in termini intuitivi? Ci sono altre relazioni conosciute?
E l'ultimo riguarda la risoluzione dei conflitti. L'articolo descrive bene ciò che costituisce un'inadeguatezza in un automa a turni; c'è un modo per risolvere queste inadeguatezze, simile ai modi di risolvere i conflitti in un parser LR tradizionale? Qualcosa come la risoluzione dei conflitti in stile yacc tramite precedenza e associatività potrebbe essere implementato in un generatore di parser ShRe?
Grazie se leggi tutto questo ed eventuali risposte saranno molto apprezzate :)