PDA

Visualizza la versione completa : [C] scansionare direttiva in scanner


matteo martis
14-07-2011, 08:43
Salve!
sto creando uno scanner per il linguaggio C,
ho quasi finito, ma non riesco a capire come fare
per suddividere in token la direttiva #include per via
degli apici angolari e della loro ambiguità.

#include <stdio.h>

se ci fossero solo gli apici normali non avrei problemi.

Grazie!

LeleFT
14-07-2011, 08:59
Cerca di spiegare un po' meglio il problema, perchè non credo sia così chiaro.
Quale sarebbe l'ambiguità delle parentesi angolari? In che modo ti crea difficoltà quella riga di codice?

Magari se posti la parte di codice dove non riesci a risolvere questa ambiguità, qualcuno ti saprà dare maggiore aiuto.


Ciao. :ciauz:

matteo martis
14-07-2011, 09:19
Io assegno #include allo speciale tipo di token direttiva è questo va bene.

#include <stdio.h>

Dopo aver letto l'include si passa allo spazio che viene
saltato... successivamente io devo leggere il carattere
'<', ma non so come fare a distinguere il caso in cui il
simbolo sia il simbolo minore e il caso in cui faccia parte
della direttiva del preprocessore e funga da apice
contenente la stringa del file di libreria; lo stesso problema
si ritrova con il simbolo '>' alla fine della direttiva.

i vari pezzi di codici fatti sono i seguenti:

/* quando sono nello stato S riconosco il simbolo #*/
case '#': // sharp: inizio di una direttiva del preprocessore (#include)

tkn->type = 70;
tkn->value[i] = c;
i++;
current_state = DIRECTIVE;
break;
/* nello stato directive termino la scansione del #include */
case DIRECTIVE:
if(isalpha(c)) { tkn->type = 70; tkn->value[i] = c; i++; }
else if( c == ' ') { tkn->value[i] = '\0'; i = 0;current_state = DIR_SPACE; }
else { tkn->type = 10; tkn->value[i]=c; current_state = ERROR; i++;} break;

/* nello stato DIR_SPACE mi 'mangio' gli spazi*/
case DIR_SPACE: if( c == ' ') {
//rimango semplicemente nello stesso stadio senza fare niente }
else if( c =='"' || c == '<' ) //aperte parentesi della direttiva
{ current_state = H_FILE; } else
{ tkn->type = 10; tkn->value[i]=c; i++; current_state = ERROR; }
break;
/* nello stato H_FILE leggo il nome del file della libreria*/
case H_FILE:
if( isalpha(c) || c == '.')
{ tkn->type = 71; tkn->value[i] = c; i++; }
else if( c == '>' || c == '"') { eot = TRUE;}
else { kn->type = 10; tkn->value[i]=c; current_state = ERROR; i++;}

oregon
14-07-2011, 09:22
Beh, non ho seguito il codice, ma il significato delle parentesi angolari lo devi dedurre dal contesto.

Ovvero, dopo che il tuo programma ha identificato la parola chiave

#include

e dopo che ha saltato gli spazi e le tabulazioni (possono essere più di uno), si "deve" aspettare una parentesi angolare aperta "<"; analogamente, ottenuta la parentesi angolare aperta, il programma si deve aspettare, prima o poi, quella chiusa ">"

matteo martis
14-07-2011, 09:26
e come 'potrebbe' farseli aspettare questi due simboli?

LeleFT
14-07-2011, 09:27
Originariamente inviato da oregon
e dopo che ha saltato gli spazi e le tabulazioni (possono essere più di uno), si "deve" aspettare una parentesi angolare aperta "<"; analogamente, ottenuta la parentesi angolare aperta, il programma si deve aspettare, prima o poi, quella chiusa ">"

Oppure si deve aspettare i doppi apici... se non ricordo male, i doppi apici indicano un file nella directory corrente, mentre le parentesi angolare indicano di cercare il file nelle directory di include configurate nel sistema.


Ciao. :ciauz:

oregon
14-07-2011, 09:47
Originariamente inviato da matteo martis
e come 'potrebbe' farseli aspettare questi due simboli?

Che vuoi dire?

Te l'ho detto, il tuo programma deve individuare la

#include

e quindi, nella continuazione dell'analisi, aspettarsi il carattere < (o come giustamente dice Lele) un "

L'analisi sintattica di un codice sorgente (dato un linguaggio e una grammatica) non si può improvvisare. I programmi di questo genere seguono metodologie precise, usano strutture dati adeguate e molte volte usano la ricorsività.

Documentati sul web, ad esempio

http://www.laureateci.it/insegna/linguaggi/fanizzi/LP9.pdf

matteo martis
14-07-2011, 09:47
io stavo pensando ad un tipo enumerativo con i valori OFF, SPACE e FILE.

oregon
14-07-2011, 09:56
Originariamente inviato da matteo martis
io stavo pensando ad un tipo enumerativo con i valori OFF, SPACE e FILE.

Per fare cosa?

Mi sorge il sospetto che tu non legga le risposte ...

Loading