I esercizio (20/04/05): analizzatore lessicale per espressioni aritmetiche

Si deve scrivere una funzione next_token che suddivide in token una espressione aritmetica descritta dalla grammatica

e ::= ( e1 op e2 ) | n | s
op ::= + | *
n ::= un numero naturale decimale
s ::= una sequenza alfanumerica che comincia con un carattere alfabetico

La funzione next_token legge l'input e a ogni chiamata ritorna il successivo token letto dall'input, restituendo le informazioni necessarie alla identificazione del token:

  • se si tratta di una stringa, ovvero di un identificatore, e la stringa corrispondente

  • se si tratta di un naturale e il suo valore

  • se si tratta di un operatore aritmetico e di quale si tratta (+ o *)

  • se si tratta di una parentesi aperta o chiusa

Il programma dovrà essere completato da un main che apre l'eventuale file da cui leggere se si vuole fornire l'input da file e non da stdin ed esegue un ciclo di lettura fino alla fine del file oppure fino alla lettura di un token speciale che segnala la terminazione (ad esempio, il carattere '.'), stampando dopo ogni token le informazioni che si sono lette.

Soluzione

  • token.c: contiene l'implementazione di next_token e una funzione print_tk che stampa un token. Tra i simboli è stato aggiunto il '.' per poterlo usare come terminatore dell'input.

  • token.h: header file contenente la definione di token e i prototipi delle funzioni in token.c.

  • test-token.c: un semplice programma che verifica token.c e tokene.h leggendo e stampando una sequenza di token terminata da un '.' letta da input.

-- StefanoGuerrini - 28 Apr 2005


This topic: Labprog2pz > WebHome > IEs
Topic revision: r2 - 2005-05-04 - StefanoGuerrini
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback