Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] scansionare direttiva in scanner

    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!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    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:
    codice:
    /* 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++;}

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ">"
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    e come 'potrebbe' farseli aspettare questi due simboli?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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/lin...anizzi/LP9.pdf
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    io stavo pensando ad un tipo enumerativo con i valori OFF, SPACE e FILE.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.