Come vengono propagati i lookahead nel metodo "channel" di costruzione del parser LALR?

0

Il metodo è descritto in Dragon Book, tuttavia ne ho letto in "" Parsing Techniques "di D.Grune e C.J.H.Jacobs".

Comincio dalla mia comprensione della creazione di canali per NFA:

    I canali
  1. vengono creati una volta, sono come canali d'acqua con corrente
  2. tu "rilascia" i simboli lookahead nelle giuste posizioni (fonti) del canale e si propagano con "corrente"
  3. quando il simbolo si propaga, non ci sono barriere (le sole cose sufficienti per la propagazione sono la presenza di canale e direzione / corrente); vale a dire lookahead non può morire dal nulla

È giusto?

Se sono corretto, allora eof lookahead dovrebbe essere presente in tutti gli stati, perché la fonte è la produzione iniziale e tutti gli altri stati di produzione sono raggiungibili dallo stato iniziale.

Il modo in cui il DFA è ricavato da questo NFA non è perfettamente chiaro per me - gli autori del libro menzionato scrivono sulla conservazione dei canali, ma non vedo alcuno scopo, se propagassi i tuoi punti di vista. Se i canali devono essere preservati, vengono interrotti dall'origine se lo stato di DFA non include lo stato NFA di origine? Suppongo di no - i canali continuano a funzionare tra gli stati DFA, non solo all'interno dello stato DFA specificato.

Nell'effetto eof dovrebbe essere ancora presente in tutti gli articoli in tutti gli stati. Ma quando dai un'occhiata a DFA presentato nel libro (pdf è da errata):

DFA per LALR (figura 9.34 nel libro, p.301)

vedrai che ci sono elementi senza eof in lookahead.

La grammatica di questo DFA è:

S -> E
E -> E - T
E -> T
T -> ( E )
T -> n

Quindi come è stato calcolato, quando eof è stato eliminato e in quali condizioni?

Aggiornamento

È pdf testuale, quindi due stati interessanti (in DFA; # è eof ):

Stato 1:

S--- >•E[#]
E--- >•E-T[#-]
E--- >•T[#-]
T--- >•n[#-]
T--- >•(E)[#-]

Stato 6:

T--- >(•E)[#-)]
E--- >•E-T[-)]
E--- >•T[-)]
T--- >•n[-)]
T--- >•(E)[-)]

L'arco da 1 a 6 è etichettato ( .

    
posta greenoldman 30.11.2012 - 16:33
fonte

1 risposta

0

Penso di aver capito.

Ci sono barriere. Quando pensi a NFA (e DFA, ma poi pensi agli elementi, non agli stati), ci sono le transizioni di chiusura e le transizioni di spostamento, giusto?

Ad esempio - quando hai T -> . ( E ) (stato 1, ultimo elemento nel file pdf) a T -> ( . E ) (stato 6, primo elemento) questa è la transizione a turno e tutti i simboli lookahead ( # e - ) stanno fluendo felicemente.

Tuttavia, la transizione di chiusura iniziale uccide tutti i lookaheads (x) - devi calcolarli da zero. La transizione della chiusura continua non uccide i lookaheads.

Dai un'occhiata allo stato 6 - tutti tranne il primo elemento, sono effetti delle transizioni di chiusura. Il secondo ottiene ) da quello superiore e - da se stesso. Il terzo indipendentemente dalla transizione che consideri prende ) e - . E per gli ultimi 2, la transizione di chiusura continua fornisce anche ) e - .

(x) Esiste un'eccezione: se il puntatore si trova accanto all'ultimo simbolo in produzione, copi i lookheads. Esempio A -> B . C , quando crei chiusura per C copi i lookahead da A , perché C in tal caso deve terminare con lo stesso materiale di A .

Per riassumere - hai transizione a turno, copia tutti i lookaheads.

Hai chiuso:

  • come da X -> A B C D . E , in tal caso copia lookaheads come per la transizione shift

  • come da X -> A . B C D E , calcola FIRST per C D E (attenzione, non solo C ) e usalo (copia) come lookaheads per B closure, se l'intera catena può essere vuota ( C D E ) copia lookaheads come anche per shift

risposta data 30.11.2012 - 17:52
fonte

Leggi altre domande sui tag