L'output di un parser deve essere un albero o potrebbe anche essere un grafico generale?
Inoltre, esiste una lingua esistente o plausibile che utilizza la rappresentazione di grafici generali anziché alberi per la loro sintassi?
L'output di un parser deve essere un albero o potrebbe anche essere un grafico generale?
Inoltre, esiste una lingua esistente o plausibile che utilizza la rappresentazione di grafici generali anziché alberi per la loro sintassi?
Risposte:
L'output di un parser non deve necessariamente essere un albero. In effetti, quando consideri cose come i riferimenti dall'USO di una variabile alla sua DEFinizione sovrapposti all'albero della sintassi astratto, hai immediatamente un grafico.
Il fatto è che l'analisi generalmente è progettata per avvenire in un unico passaggio: questo è importante per ragioni storiche, come la mancanza di spazio e la velocità del processore, ma anche perché è più semplice ragionare. Quindi le fasi successive decorano l'albero di analisi con ulteriori informazioni.
Ci sono cose come le grammatiche grafiche, anche se non so se vengano utilizzate per analizzare i linguaggi di programmazione.
La domanda del PO è un po 'arretrata. Naturalmente, un algoritmo di analisi può produrre tutto ciò che vuole. La domanda è più per capire a cosa serve l'analisi e se il parser produce un risultato che soddisfa questo obiettivo. Quindi ci si può chiedere quale sia la rappresentazione appropriata per questo, ad esempio un albero o un grafico.
Bene, immagino che un parser sia un algoritmo che ti darà la struttura sintattica di una frase data come input, secondo una data definizione formale della sintassi del linguaggio.
Si noti che le persone potrebbero non essere d'accordo su ciò che costituisce la sintassi della lingua. Alcuni possono limitarlo a una struttura portante del linguaggio formale puro, mentre altri possono introdurre considerazioni leggermente più semantiche come tipo, genere, numero o altri più complessi (non sto distinguendo la PNL o i linguaggi di programmazione). La maggior parte delle lingue ha caratteristiche che richiedono la rappresentazione di grafici, ma spetta all '"implementatore" (per mancanza di una parola migliore) decidere se desidera includerlo nella sintassi.
Quindi, a seconda di quale sia la sintassi definita, potrebbe essere necessario produrre un diverso tipo di struttura formale.
Nel semplice caso di puro analisi senza contesto, un albero di analisi può fare, tranne per il problema dell'ambiguità affrontato di seguito, o per il fatto che potresti voler modificarlo un po 'per ottenere un AST (vedi sotto).
Tuttavia, in casi più complessi, potresti aver bisogno di strutture diverse, spesso rappresentate da collegamenti nella struttura ad albero, portando così a una struttura grafica. Questo dipende molto dalla tua definizione della sintassi del linguaggio.
Inoltre, quale albero dovresti produrre non è ovvio. Se prendi il caso delle grammatiche adiacenti agli alberi (TAG), funzionano in modo tale che l'albero della sintassi non sia uguale all'albero di derivazione, sebbene il primo possa essere derivato dal secondo. Che si desidera produrre potrebbe essere una domanda rilevante.
C'è anche un altro problema riguardante l'ambiguità. Una determinata frase, pur appartenendo alla tua lingua, può farlo in molti modi diversi, può essere assegnata una struttura sintattica in molti modi diversi.
Quindi puoi scegliere di produrre solo una di queste strutture, scelte casualmente o secondo alcuni criteri ben definiti (ad esempio similitudine). Puoi anche scegliere di emetterne diversi o tutti. Se si desidera produrne diversi, di solito è conveniente comprimersi in una struttura unica che condividerà ciò che hanno in comune. Questo risparmio di spazio e di tempo di elaborazione e complessità può essere un vero problema.
Quando si sceglie di emetterli tutti, non si ha altra scelta che condividere, perché potrebbe esserci un numero infinito di possibili analisi. E l'infinito può essere rappresentato finitamente solo avendo in qualche modo un ciclo in un grafico. Quindi devi produrre una struttura grafica in generale. Ma le proprietà di questa struttura grafica sono correlate al tipo di sintassi formale che hai scelto.
Ora la domanda riguardava anche gli alberi di sintassi astratti. Ho saltato la parte "astratta" dal momento che avrebbe creato confusione, imho. In effetti la questione è già confusa nelle sue varie riformulazioni.
Per quanto riguarda le AST in prospettiva storica, hanno origine con il linguaggio Lisp e programmano i sistemi di manipolazione negli anni 1960-1970. L'idea era di considerare i programmi come grandi espressioni, come formule matematiche, sia a scopo di manipolazione sia per analizzare le proprietà o definire la semantica in modo formale, che i matematici sanno fare sulle formule. Come formule, erano naturalmente strutturate ad albero, ma potevano essere decorate con varie informazioni che trasformavano questi alberi in grafici. Ciò era conveniente sia formalmente che pragmaticamente ed è stato ulteriormente utilizzato da compilatori e sistemi di programmazione.
Fondamentalmente, un AST è un albero, come suggerisce il nome, ma può portare ulteriori informazioni. Il resto è nelle scelte dell'attore e negli occhi di chi guarda. È un grafico o un albero decorato? Tuttavia, l'albero AS di base è importante, poiché si tratta dell'impalcatura su cui si basa sia in teoria che in programmazione.
Si noti che l'AST era distinto dall'albero di analisi (la sintassi era basata sul contesto libero) come prodotta dall'algoritmo di analisi studiato nella teoria del linguaggio formale. Il motivo era che il design della sintassi era vincolato dalla tecnologia di analisi del tempo, a sua volta limitata dalla bassa potenza di calcolo disponibile. Il risultato fu che gli alberi di sintassi erano solo varianti torturate di ciò che si considererebbe naturalmente la struttura del programma, e ulteriori elaborazioni, che non facevano realmente parte del processo di analisi formale di base, dovevano essere eseguite per ottenere la versione più pulita e semplice chiamata AST.
Tuttavia, la rappresentazione degli alberi sul computer, astratta o no, è in qualche modo limitata quando si desidera rappresentare tutte le strutture di una frase ambigua. In particolare, ciò nasconde problemi di complessità. Anche la conservazione delle ambiguità in una struttura grafica, mentre la conversione da alberi di analisi ad alberi AS può essere un problema. Tuttavia, se ti interessa, spesso è possibile definire la sintassi concreta in modo tale che l'albero di analisi possa fungere da AST. Ciò è consentito dagli algoritmi molto generali che gestiscono l'ambiguità e dalla potenza dei computer attuali.
Se analizzi usando l'analisi GLR (Generalized LR) e se l'analisi dell'input è ambigua (ci sono molti modi possibili per analizzare l'input), allora il risultato dell'analisi può essere considerato un DAG di analisi, piuttosto che un DAG albero di analisi. Il DAG di analisi codifica in modo compatto molti possibili analisi: più possibili alberi di analisi.
Tuttavia, la linea di fondo rimane che se si dispone di una grammatica senza contesto e se la stringa di input è analizzabile in modo inequivocabile (esiste una sola derivazione nella grammatica che produce questa stringa di input) e se il lavoro di analisi è di produrre quella derivazione ... quindi in queste condizioni, l'output dell'analisi sarà sempre necessariamente un albero di analisi, perché qualsiasi produzione di una grammatica senza contesto ha intrinsecamente una struttura ad albero.
Una volta ho scritto un interprete per C in cui "AST" per l'operatore + = (ad esempio) non era un albero. Considera a[i++] += d
dove si a[i++]
trova int
ed d
è double
. Le operazioni implicite di conversione e recupero erano esplicite nella struttura, quindi il problema è dove a[i++]
raddoppiare il recupero e la conversione. La nostra soluzione era abbandonare gli alberi. Il risultante "ASG" sembrava così
+=
/ | \
/ | \
/ | \
/ convert \
| | \
| fetch fetch
| / |
index d
/ \
a postinc
|
i
Sono stato perplesso da solo, finché non mi sono appena reso conto che non è l'albero che è astratto, né si tratta di un "albero di sintassi" astratto, ma della sintassi è astratta.
Quindi, per rispondere alla tua domanda, concludo che un albero di sintassi astratto, così come un albero di sintassi concreto o un albero decisionale, o qualsiasi altro albero, dovrebbe essere meglio un albero.
D'altra parte, nulla dovrebbe impedire a nessuno di utilizzare un grafico di sintassi astratto, un diagramma di sintassi astratto, un cubo di sintassi astratto o una specifica di sintassi astratta.
Suppongo che un albero di sintassi astratto di "albero di sintassi astratto" mi avrebbe aiutato a evitare la confusione.