260 likes | 440 Vues
Corso di Laurea in Informatica (AA 2004/2005). Linguaggi di Programmazione - elementi. Gabriella Pasi e Carla Simone gabriella.pasi@itc.cnr.it simone@disco.unimib.it. ESERCIZIO. Esempio : V = {a,b,c,d} N = {A,S} Start Symbol S. P = {S cAd, A bAb|a }.
E N D
Corso di Laurea in Informatica (AA 2004/2005) Linguaggi di Programmazione - elementi Gabriella Pasi e Carla Simone gabriella.pasi@itc.cnr.it simone@disco.unimib.it
ESERCIZIO Esempio: V = {a,b,c,d} N = {A,S} Start Symbol S P = {S cAd, A bAb|a} Grammatica di tipo context free Derivazione per cbabb? Non esiste! Derivazione per cbbbabbbd? S cAd cbAbd cbbAbbd cbbbAbbbd cbbbabbbd Linguaggio generato da G: L(G) = {cbnabnd|n0}
ESERCIZIO Dato il linguaggio L = {anbcdn | n 0} costruire una grammatica che lo genera. V = {a,b,c,d} N = {A,S} Start symbol S P = {S A, A aAd|bc} E’ possibile utilizzare una grammatica regolare? Se si, dare la sua definizione. NO
ESERCIZIO Dato il linguaggio L = {anbcdm | n 0, m 0} costruire una grammatica che lo genera. V = {a,b,c,d} N = {A,S} P = {S A; A aAd|bc|aA|Ad} P = {S A A aA|bc|Ad} E’ possibile utilizzare una grammatica regolare? Se si, dare la sua definizione. SI S aS|bC C cD|c D dD|d
L = {anbcdm | n 0, m 0} P = {S bC | aA A aA | bC C cD |c D dD | d Regolare? SI
ESERCIZIO Data la grammatica V = {x} N = {S,X,B} P = S xX X x X xB B xX A) di che tipo e’ la grammatica? regolare, lineare a destra B) mostrare una derivazione per xxxxx e una per xxxx S xX xxB xxxX xxxx Non esiste derivazione per xxxxx C) qual’e’ il linguaggio generato? L(G) = {x2n |n>=1} D) Esiste una grammatica context free che lo genera? Se si, dare la sua definizione. S X X xXx|xx
ESERCIZIO Dato il linguaggio L = {abncdn | n 0} costruire una grammatica che lo genera. V = {a,b,c,d} N = {A,S} P = {S aA, A bAd|c} E’ possibile utilizzare una grammatica regolare? Se si, dare la sua definizione. NO
ESERCIZIO Esempio: V = {a,b} N = {A,S} S assioma P = {S a|aA, A a|b|aA|bA} A) Di che tipo e’ la grammatica? regolare, lineare a destra B) Derivazione per baab? Questa stringa non e’ generabile C) Derivazione per abba? S aA abA abbA abba Linguaggio generato da G: il linguaggio delle stringhe non vuote su {a,b} che iniziano per a
ESERCIZIO V = {a,b,c} N = {S,X} S assioma P = {S X|e, X aXa|bXb|c} context free A) Di che tipo e’ la grammatica? B) Derivazione per abcba? S X aXa abXba abcba Linguaggio generato da G: il linguaggio delle stringhe palindrome su {a,b,c} con una e una sola c al centro, piu’ la stringa vuota.
ESERCIZIO Dato il linguaggio L = {anb2n | n > 0} costruire una grammatica che lo genera. V = {a,b} N = {S,X} Start Symbol S P = {S X, X aXbb|abb}
ESERCIZIO V = {a,b,c} N = {S,A} S assioma P = { S aSc|A A bAc|e} Linguaggio generato da G? L(G) = {anbmcn+m |n,m0} Regole di produzione senza ricorsione su S: P = {S A A aAc|B B bBc|e} N = {S,A,B}
ESERCIZIO Il linguaggio L(G) = {anb|n 0} puo’ essere generato da una grammatica regolare? V = {a,b} N = {S,A} S assioma P = {S Ab|b A Aa|a} Usare una context-free non da’ vantaggi
ESERCIZIO Definire una grammatica che generi il linguaggio L(G) = {anbn |n 0} V = {a,b} N = {S,A} S assioma P = {S A A aAb|ab|e}
ANALISI SINTATTICA Data una grammatica G si pone il problema di verificare se una data stringa appartiene al linguaggio L(G): • analisi lessicale: controlla che i simboli utilizzati appartengano all'alfabeto • analisi grammaticale: verifica il rispetto delle regole grammaticali
Linguaggi di programmazione • Linguaggio macchina: binario, implica la conoscenza della macchina e dei metodi di rappresentazione delle informazioni. • Linguaggio assembler: linguaggio macchina in cui nomi e simboli prendono il posto dei codici numerici associati a istruzioni, e riferimenti alle celle di memoria (indirizzi) maggiore leggibilità. • Linguaggi di “alto livello”: • astrazione dall’architettura sottostante • portabilità dei programmi; • maggiore semplicità di uso • esistono librerie di programmi già pronti; • per essere eseguiti devono essere tradotti in linguaggio macchina.
Linguaggi di programmazione Affinchè un programma scritto in un qualsiasi linguaggio di programmazione sia comprensibile (e quindi eseguibile) da un elaboratore occorre tradurlo dal linguaggio originario al linguaggio macchina. Questa operazione viene normalmente svolta da programmi speciali, detti traduttori.
Traduttori Il traduttore converte il testo di un programma scritto in un particolare linguaggio di programmazione (sorgente) nella corrispondente rappresentazione in linguaggio macchina (eseguibile). Due categorie di traduttori: • i Compilatoritraducono l’intero programma (senza eseguirlo!) e producono in uscita il programma convertito in linguaggio macchina • gli Interpretitraducono ed eseguono immediatamente ogni singola istruzione del programma sorgente.
Traduttori Quindi: • nel caso del compilatore, lo schema viene percorso una volta solaprima dell’esecuzione • nel caso dell’interprete, lo schema viene invece attraversato tante volte quante sono le istruzioniche compongono il programma.
Analisi lessicale L’analizzatore lessicale o scanner, verifica la correttezza delle parole utilizzate ed estrae i cosiddetti token (parole chiave, identificatori, costanti, operatori, ecc.) ==> Grammatiche regolari (LEX) Lo scanner trasforma un testo in una sequenza di token. Ad esempio l’istruzione x:=100 viene trasformata nella sequenza: identificatore, operatore di assegnamento, costante.
Analisi sintattica L’analizzatore sintattico o parser, verifica la correttezza delle espressioni (frasi) nel programma sulla base della corretta applicazione delle regole sintattiche (regole di produzione, definite in BNF o mediante grafi sintattici). ==> Grammatiche context-free (YACC) Analisi semantica L’analizzatore semantico ha lo scopo di stabilire se un’espressione ha significato. Non è possibile verificare ciò per qualsiasi espressione: quello che i compilatori sono in grado di fare è stabilire la violazione di alcune regole semantiche. Ad esempio operazioni tra operandi di tipi non compatibili, applicazione di funzioni con un numero di parametri diverso da quelli dichiarati (ordine e tipo), uso di oggetti non dichiarati, operatori illegali per il tipo di oggetti a cui sono applicati.
AMBIENTI DI PROGRAMMAZIONE: caso 1 (compilatori) Editor: serve per creare file che contengono testi (cioè sequenze di caratteri). In particolare, l’editor consente di scrivere il programma sorgente. Compilatore: opera la traduzione di un programma sorgente (scritto in un linguaggio ad alto livello) in un programma oggetto. Linker: (collegatore) nel caso in cui la costruzione del programma eseguibile richieda l’unione di più moduli (compilati separatamente), il linker provvede a collegarli formando un unico programma eseguibile. Debugger: consente di eseguire passo-passo un programma, al fine di scoprire ed eliminare errori non rilevati in fase di compilazione.
Il processo di Traduzione compilatore linker loader