ANALISI

L’ analisi LL(k), costruendo l’albero top-down, necessita di dedurre la prossima mossa da intraprendere osservando i prossimi simboli di input, di conseguenza risulta utile solo nel caso di linguaggi con (nel caso dell’assegnamento )

L’analisi invece ribalta il paradigma ricostruendo l’albero in bottom-up

flowchart LR
subgraph LL
A{SCOPO}
B[frase da riconoscere]
A --produzioni--> B
end
subgraph LR
C{SCOPO}
D[frase da riconoscere]
D --produzioni--> C
end
LL ~~~ LR

Questo approccio rende l’analisi LR si più potente, infatti l’ insieme dei linguaggi contex free riconoscibili per mezzo dell’analisi LL e contenuto in quelli riconoscibili per mezzo dell’ analisi LR.

Tuttavia l’analisi LR risulta più complessa da progettare e computazionalmente più esosa, esistono quindi tecniche che approssimano l’analisi LR come SLR o LALR

ARCHITETTURA DI UN PARSER

Un parser ricostruisce l’albero di derivazione della frase in analisi al contrario, di conseguenza necessita di comprendere quando sia necessario fare:

  • un operazione di SHIFT ovvero leggere da input un altro valore (aggiungere all’albero una foglia)
  • un operazione di REDUCE ovvero applicare al contrario una produzione (costruire un nodo padre da 1 o più nodi figli)

La decisione viene presa in base a un contesto corrente (stato) in cui il riconoscitore si trova a operare

Il componente software imputato di tale compito e il RICONOSCITORE DI CONTESTI

ANALISI

Nel caso dell’analisi e utile partire con il caso in cui ovvero non ci sono informazioni sul futuro, che nel caso dell’ analisi LL non aveva senso ma nel caso dell’analisi si ha sempre l’informazione di contesto che può guidare il parser

CONTESTI

Vengono di conseguenza definiti i contesti :

data una produzione della forma l’inseme dei contesti e cosi definito

ovvero tutti i simboli che possono comparire a sinistra in una forma di frase nel momento in cui viene applicata la produzione , data questa definizione tutti i contesti differiscono solo per il prefisso (utile per calcolare l’insieme)

CONTESTI SINISTRI DI UNA PRODUZIONE

Data la definizione di cui sopra e possibile calcolare i contesti di una data produzione come concatenazione dell’insieme dei e del valore , l’insieme dei e detto l’insieme dei contesti sinistri di

Quindi per trovare i contesti e sufficiente trovare i contesti sinistri delle varie produzioni e concatenarli con il valore delle produzioni stesse

CALCOLO DEI CONTESTI SINISTRI

Data la produzione si può dire che uno dei contributi al contesto sinistro di e dato dai contesti sinistri di concatenati al simbolo :

Il ragionamento si può iterare fino a risalire allo scopo della grammatica che per definizione ha , inoltre dai due postulati si deriva che la grammatica dei contesti e sempre regolare a sinistra (riconoscibile da un RSF)

Data la grammatica che segue:

Applicando quanto detto prima si ottengono i seguenti contesti sinistri

Dati i contesti sinistri se i corrispondenti CONTESTI LR(0) non collidono l’automa riconoscitore sara deterministico

flowchart TD
A((1))
B((2))
C((3))
D((4))
E((5))
F((6))
G(Z->S)
H(B->b)
I(A->B)
J(S->BA)
K(A->aA)
L(S->aSAB)
START:::hidden --> A
A --a--> B
A --b--> H
A --B--> D
A --S--> G
B --b--> H
B --a--> B
B --S--> C
C --b--> H
C --A--> E
D --b--> H
D --a--> F
D --A--> J
D --B--> I
E --B--> L
E --b--> H
F --a--> F
F --b--> H
F --B--> I
F --A--> K
classDef hidden display: none

TABELLA DI PARSING

La tabella di parsing puo essere ricostruita con le seguenti regole

  • per ogni arco con input il simbolo terminale a, si inserisce in tabella alla posizione l’azione shift to
  • per ogni arco con input (da stack) il metasimbolo , si inserisce in tabella alla posizione l’azione goto
  • per ogni stato associato alla regola -esima, . si inserisce in tabella l’azione reduce in tutta la riga corrispondente allo stato Si
  • per ogni stato Si contenente la produzione Z \rightarrow S.\$$ si inserisce in tabella alla posizione (S_i , $)$ l’azione accept

Quindi per l’automa precedente si ha la seguente tabella di parsing

$$$
1
2
3
4
5
6
10
11
12
13
14
15

RICONOSCITORI PER LINGUAGGI

I riconoscitori per i linguaggi data la forma di frase corrente operano come segue:

  • eseguono SHIFT se lo stato dell’automa non e terminale e pongono nello stack il simbolo terminale letto da input
  • eseguono REDUCE se lo stato dell’automa e terminale e poppano dallo stack i simboli corrispondenti della parte destra della produzione applicata e pongono nello stack il metasimbolo della parte sinistra (non avvengono letture da input)

ogni volta che avviene una riduzione l’automa riparte dall’inizio

OTTIMIZZAZIONE, LO STACK DEGLI STATI

Per ottimizzare si può disporre di uno stack degli stati dove accumulare via via gli stati attraversati dall’automa e in fase di reduce rimuoverne tanti quanti i simboli della parte destra della produzione, in questo modo si evita di far ricominciare l’automa dall’inizio

CONDIZIONE SUFFICIENTE PER ANALISI

Per poter effettuare con successo l’analisi date due produzioni e se: e allora deve essere vero che

Ovvero ogni stato di riduzione dell’automa non deve avere archi uscenti caratterizzati da non terminali e sia etichettato

LIMITI DELL’ANALISI

l’analisi presenta dei limiti intrinsechi dovuti al fatto di ragionare solo sul contesto corrente e non avere nessuna informazione sui simboli in input successivi, per questo le grammatiche utili che rispettano la condizione sufficiente per analisi lr(0) non sono molte, per ottenere un riconoscitore utile e necessario vedere nel futuro

ANALISI

L’analisi opera secondo le stesse logiche di analisi LR(0) estendendone le definizioni e ritardando le regole di riduzione di simboli, tuttavia la complessità data dal numero di stati dell’esecutore risulta di difficile gestione anche nel caso e richiede semplificazioni (come o ) le casistiche con non sono neanche pensabili

ESTENSIONE DELLE DEFINIZIONI DI CONTESTO

Il contesto viene cosi definito

si aggiunge una stringa di lunghezza dopo il simbolo non terminale della produzione

La stringa in questione appartiene all’insieme definito come segue:

il caso e quanto introdotto parlando di riconoscitori LL

AUTOMA RICONOSCITORE

L’automa riconoscitore si sviluppa similmente a quanto visto per il caso tuttavia il numero di stati dell’automa aumenta esponenzialmente con il numero di metasimboli e terminali dato che il numero di metasimboli della grammatica dei contesti sinistri e dato da:

con simboli terminali e simboli non terminali della grammatica

APPROSSIMANDO

L’analisi per quanto potente risulta troppo complessa nel caso pratico, l’idea di base e quella di semplificare accorpando gli stati dell’automa che risultano simili fra loro

SIMPLE LR (SLR)

Simple LR mira a semplificare l’automa riconoscitore, i contesti sono cosi definiti

Si puo dunque calcolare facilmente a partire dal contesto inoltre e vero che:

ovvero il contesto SLR è un po’ più grande, e quindi più esposto a potenziali conflitti, del contesto LR completo

Look-Ahead LR (LALR)

Un altra idea consiste nel accorpare assieme gli stati del parser identici al netto dei look-ahead set:

  • PRO: è una trasformazione sempre possibile, spesso molto conveniente perché il parser LALR ha molti meno stati dell’LR

  • CONTRO: possono apparire conflitti reduce/reduce, tipicamente gestibili.

PREVIOUS NEXT