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