Newsgroup: it.comp.programmare
Titolo: Cosa sono e dove li posso trovare?

Ciao, ho letto il thread sul compilatore di Paolo e sono interessato pure io
all'argomento. Augusto Pucci  ha detto di procurarsi un Parser ed uno
scanner ed ha dato dei consigli.
Ma cosa sono gli scanner ed i parser?
Sono forse programmi che traducono i simobili del codice ad alto livello in
codice macchina?
Grazie, ciao.



si stava riferendo a Flex e Yacc.....
cmq si tratta di strumenti che prendono in input un testo, e
attraverso delle regole grammaticali (che é la sintassi del
linguaggio) interpretano il significato del testo cercando di giungere
a un codice intermedio, da utilizzare in fase di compilazione
cod

 ha scritto:

Se sei veramente interessato all'argomento (nel senso pratiko del termine),
dovresti prima studiarti la Teoria, che può essere anche parecchia e
moolto più astratta di quello che pensi.
Lo scanner (analizzatore lessicale) e il parser (analizzatori sintattici)
saranno i tuoi obiettivi, non i tuoi utensili.
Quello che dovresti procurarti sono invece dei "generatori di" scanner e parser,
come Lex (Flex) e Yacc (o Bison, se hai gusti particolari); se poi
ti piace il Java allora punta su JLex (JFlex) e Cup (o ...).
Per la Teoria, io conosco solo un libro:
"Compilers. Principles, Techiques, and Tools"
di Aho, Sethi, Ullman
ed. Addison-Wesley
circa 90Klire  <sigh>
però potresti cercare su qualche sito...
Teòria
-- 
se poi scriverete un "C++ Robots",
fatemelo sapere.

 circa 90Klire  <sigh>
Si, infatti penso di comprarlo :-)
Grazie mille!

 a un codice intermedio, da utilizzare in fase di compilazione
Ma fondamentalmente come è strutturato un compilatore? Di quanti parti è
fatto?
Ho il sorgente del gcc ma è un casino di roba che non so da dove
cominciare!!!!!

Ma cosa sono gli scanner ed i parser?
Dunque per la precisione avevo consigliato all'interessato di
procurarsi un generatore di scanner e uno di parser..perche' mettersi
a scrivere da zero un aprser e uno scanner e' suicida come idea :-)
Duqnue... in termini semplici uno scanner (o analizzatore lessicale)
e' un programma (o una funzioen incorporata in un programma...) che si
occupa di leggere da una stream in input (da un file per esempio) e
scompone il file in tokens, o atomi che dir si voglia.
Ad esempio la seguente linea di codice C:
if(pippo>10) printf("Pippo e' maggiore di dieci");
data in pasto ad uno scanner potrebbe essere divisa in token in
diversi modi ad esempio nelle seguenti unita':
IF ( CONDIZIONE ) STAMPA ( STRINGA ) FINE_ISTRUZIONE
(o in diecimila altri modi..dipende da come si progetta lo scanner
naturalmente).
Ora, lo scanner da solo non farebbe altro che scandire la stringa di
testo iniziale alla ricerca di pattern che soddisfino certe regole
(non scendo nei dettagli ma le regole sono appunto le espressioni
regolari care ai programmnatori Perl :-) ) se una sequenza di byte
soddisfa una regola allora lo scanner esegue del codice (naturalemtne
secondo el intenzioni del progettista) e solitamente restituisce al
chiamante della funzione scanner un numero.
Il parser invece va ad interagire con lo scanner chiamandolo
continuamente e operando in base a cio' che lo scanner gli ritorna.
Il aprser (o analizzatore sintattico) cerca di fare un matching fra
gli atomi (o simboli dell'alfabeto) riconosciuti dallo scanner e le
regole di produzione per il linguaggio in esso codificate.
Quando viene soddisfatta uan regola lo scanner esegue del codice (ade
sempio scrive su un file did estinazione).
In sostanza lo scanner si occupa di tokenizzare il file sorgente,
mentre il parser lo interpreta e opera di conseguenza.
Per realizzare un compilatore (o un interprete) e' necessario allora
costruirsi uno scanner e un parser (piu' altre amenita' accessorie).
In questo improbo compito ci vengono in aiuto alcuni soft
interessanti, in particolare lex (e il piu' recente Flex) sono
programmi che dato un file di regole (ove sono codificate le
espressioni regolari da riconoscere e il codice da eseguire) generano
un file sorgente in C (generalmente lex.yy.c) che contiene la funzione
yylex() di scanning... da notare che esistono anche tools simili che
generano classi Java ad esempio JFlex.
Per quanto riguarda la creazione di parser vale il discortso di
prima..ci vengono in aiuto yacc (Yet Another Compiler Compiler), byacc
o il suo corrispondente GNU Bison che partendo da un file di
definizione della garmmatica con codice da eseguire corrispondente
generano un file sorgente in C... anche qui abbiamo ancxhe la
soluzione Java che e' javacc.
In generale comunque non e' per nulal semplice anche con talis
trumenti di supporto realizzare un compilatore..percio' per iniziare
ti consiglierei di fare pratica cercando di creare un piccolo
interprete , oppure un compilatore si' ma per una piccola macchina
virtuale realizzata ad hoc..cosi' ti eviti inizialmente di doverti
preoccupare dell'ASM in cui dovrai tradurre.
Augusto Pucci ( 
http://www.prospektiva.it/webmaster/
 )
Webmaster di Prospektiva On-line
http://www.prospektiva.it
Webmaster di SIPO Toscana
http://sipotoscana.supereva.it

 preoccupare dell'ASM in cui dovrai tradurre.
Grazie mille per l'esauriente risposta. Allora, essendo un hobbista, per
prima cosa mi procurerò quel testo edito dalla Addison Wesley di cui si è
parlato, in secondo luogo inizierò a vedere il codice 'c-parse.c' del
compilatore gcc per vedere come diavolo è fatto. Anzi l'ho già visto e
contiene una serie di tabelle con valori numerici....cosa sono di preciso?
Sono forse dei valori da dare alle istruzioni del linguaggio. Ho visto anche
il file header di tale file e contiene vari riferimenti a parole chiave del
C....
Cmq grazie per la risposta.
A presto! :-)

parlato
Tieni presente, comunque, che quel testo e' molto vecchio, anche se e'
ottimo.  Probabilmente trovi qualcosa di piu' recente.