Qual è l'esempio più semplice là fuori per spiegare la differenza tra Parse Trees e Abstract Syntax Trees?


14

Per quanto ne so, un parser crea un albero di analisi e quindi lo scarta in seguito. Tuttavia, può anche far apparire un albero di sintassi astratto, che presumibilmente utilizza il compilatore.

Ho l'impressione che sia l'albero di analisi sia l'albero di sintassi astratto vengano creati sotto la fase di analisi. Qualcuno potrebbe spiegare perché questi sono diversi?


3
Perché devono essere diversi? Non possono essere la stessa cosa da due punti di vista leggermente diversi?
S. Lott,

1
Non sono sicuro di aver capito questi due "punti di vista leggermente diversi" :-(
Combinator Logic

Questo è il punto. Sono la stessa cosa, quindi la confusione. Hai solo parole diverse a seconda del tuo punto di vista: Analisi vs. Generazione di codice (o Esecuzione, nel caso di un interprete).
S. Lott,

Non c'è differenza. Con un po 'di immaginazione si può inventare una rappresentazione di sintassi per ogni possibile albero di sintassi astratto. Con una mancanza di immaginazione, le espressioni S di Lisp sarebbero una sintassi predefinita adatta a tutto.
SK-logic,

1
Dovresti aver letto la risposta prima di commentare. C'è una differenza, ma averli separati o combinati è un problema di implementazione.
Paul,

Risposte:


20

Un albero di analisi è anche noto come albero di sintassi concreto.

Fondamentalmente, l'albero astratto ha meno informazioni rispetto all'albero di cemento. L'albero di cemento contiene ogni elemento nella lingua, mentre l'albero astratto ha gettato via i pezzi poco interessanti.

Ad esempio l'espressione: (2 + 5) * 8

Il calcestruzzo si presenta così

  ( 2  + 5 )  * 8
  |  \ | / |  | |
  |   \|/  |  | |
   \___|__/   | |
       \______|/

Considerando che l'albero astratto ha:

2  5 
 \/   
  +  8
   \/
   *

Nei casi concreti le parentesi e tutti i pezzi del linguaggio sono stati incorporati nell'albero. Nel caso astratto le parentesi sono sparite, perché le loro informazioni sono state incorporate nella struttura ad albero.


Hai dimenticato di menzionare in quale compilatore per quale lingua questo è implementato in questo modo. Perché, sai, non devi ... il parser potrebbe anche buttare via la parentesi immediatamente.
Ingo,

1
@Ingo, nulla nella mia risposta ha qualcosa da dire su quando un compilatore getta le parentesi. Chiede quale sia la differenza tra un albero di analisi concreto e un albero di analisi astratto.
Winston Ewert,

Quindi, sicuramente, puoi nominare una fonte per il tuo reclamo? O è solo una tua definizione privata?
Ingo,



0

La prima cosa che devi capire è che nessuno ti obbliga a scrivere un parser o un compilatore in un certo modo. In particolare, non è necessariamente il caso che il risultato di un parser debba essere un albero. Può essere qualsiasi struttura di dati adatta a rappresentare l'input.

Ad esempio, la seguente lingua:

prog:
      definition 
    | definition ';' prog
    ;

definition: .....

può essere rappresentato come un elenco di definizioni. (Nitpickers indicherà che un elenco è un albero degenerato, ma comunque.)

In secondo luogo, non è necessario conservare l'albero di analisi (o qualsiasi struttura di dati restituita dal parser). Al contrario, i compilatori sono generalmente costruiti come una sequenza di passaggi, che trasformano i risultati del passaggio precedente. Quindi il layout generale di un compilatore potrebbe essere così:

parser :: String             -> Maybe [Definitions]      -- parser
pass1  :: [Definitions]      -> Maybe DesugaredProg      -- desugarer
pass2  :: DesugaredProg      -> Maybe TypedProg          -- type checker
pass3  :: TypedProg          -> Maybe AbstractTargetLang -- code generation
pass4  :: AbstractTargetLang -> Maybe String             -- pretty printer

compiler :: String           -> Maybe String    -- transform source code to target code
compiler source = do
   defs  <- parser source
   desug <- pass1 defs
   typed <- pass2 desug
   targt <- pass3 typed
   pass4 targt

Bottom Line: Se si sente parlare di alberi di analisi , alberi Syntac astratti , alberi di sintassi in calcestruzzo , ecc, sempre sostituire da struttura di dati idonei allo scopo determinato , e che stai bene.


2
In che modo questa è una risposta alla domanda?
Winston Ewert,

@WinstonEwert Dichiaro che "albero di analisi" e "albero di sintassi astratto" sono astrazioni e non significano altro che "strutture dati adeguate". Quindi, la risposta è che la domanda nella sua generalità non ha senso, a meno che tu non chieda la differenza tra il tipo di ritorno del parser e il tipo di ritorno di qualche altro passaggio nel compilatore XY del linguaggio L.
Ingo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.