5

Come viene eseguita l'analisi semantica da un compilatore (generalmente)?Analisi semantica nei compilatori

Ho dovuto rispondere a questa domanda durante il mio ultimo esame, non era abbastanza per il professore.

Ho incluso BNF (con un esempio) e le carte sintattiche nella mia risposta, a cui mi ha chiesto: "Cosa succede quando il compilatore trova una dichiarazione come int i;?"

+0

Non ha coperto questo materiale della tua classe? –

+0

@IraBaxter: Sì, ma superficialmente rispetto a quello che ha chiesto durante l'esame. (male male l'inglese, scusa) – Overflowh

+1

Questo è più come un "problema umano" che un "problema tecnico", a volte gli insegnanti si aspettano una risposta molto specifica a ciò che parlano in classe ... – umlcat

risposta

7

Tempo di lettura Aho & Ullman/libro del drago con attenzione.

L'analisi semantica è l'attività di un compilatore per determinare quali sono i tipi di vari valori, come questi tipi interagiscono nelle espressioni e se tali interazioni sono semanticamente ragionevoli. Per esempio, non si può ragionevolmente moltiplicare una stringa dal nome della classe, anche se nessun editor vi vieta di scrivere

"abc" * MyClass 

Per fare questo, il compilatore deve prima identificare le dichiarazioni e gli ambiti, e in genere registra il risultato di questa passo in una serie di tabelle dei simboli. Questo indica quali identificatori specifici significano in contesti specifici. Deve anche determinare i tipi di varie costanti letterali; "abc" è un tipo diverso da 12.2e-5.

Quindi deve visitare tutte le posizioni in cui vengono utilizzati identificatori e letterali e verificare che l'uso dell'identificatore/letterale e dei risultati calcolati siano compatibili con la definizione della lingua (come nell'esempio precedente).

Per quanto riguarda come questo è fatto: in genere il codice sorgente viene analizzato, qualche rappresentazione del programma è costruito (alberi di sintassi sono molto popolari), e che la rappresentazione è camminato ("visitato") elemento per elemento per la raccolta/convalidare le informazioni semantiche. La tabella dei simboli è in genere solo un insieme di tabelle hash associate all'albero di sintassi che rappresenta un ambito, l'hashing dagli identificatori alle strutture contenenti le dichiarazioni di tipo.

+0

Penso di aver capito.Potresti solo darmi un esempio, per favore? Ad esempio, quando un compilatore trova una dichiarazione in una funzione (come 'long double f;'), inserisce in una tabella che 'f' è un simbolo, che occupa 8 byte, che può contenere numeri float, che è definito solo in l'ambito della funzione e il suo intervallo di valori? – Overflowh

+1

@unNatural: Sì, hai ragione. La chiave è l'associazione tra l'ambito, l'identificatore e il * tipo * dell'identificatore. Altri dati (come float richiede 8 byte) non devono necessariamente essere nella tabella dei simboli, perché è probabile che tale fatto sia vero per tutto il compilatore per qualsiasi valore float. È utile per le fasi successive del compilatore acquisire le informazioni sull'intervallo se è in grado di determinarlo, e questa è discutibilmente un'analisi semantica, ma la maggior parte delle persone non pensa all'analisi di intervallo come "analisi semantica del compilatore" nella ristretta gamma di questa discussione . –

+0

Ok, è chiaro :) Scusami se abusa della tua disponibilità, ma ho un'altra domanda. Secondo quanto hai detto, sembra che il BNF non abbia nulla a che fare con il processo di analisi semantica. È giusto o mi sbaglio? – Overflowh