Il Parser
La funzione
struct info_word *next_word(FILE *fp);
permette di leggere gli ipertesti parola per parola.
Il file
fp
è un file contenente un ipertesto precedentemente aperto (in lettura) con una chiamata alla funzione
FILE *open_ipertesto(char *fname);
Questa funzione rimpiazza la usuale
fopen
necessaria per l'apertura di un file testo. Termina la lettura dell'ipertesto, il file va chiuso per mezzo di una chiamata alla funzione
FILE *close_ipertesto(char *fp);
I valori ritornati da =next_word
La
next_word
ritorna una nuova struttura contenente tutte le informazioni della parola letta o NULL in caso di EOF. Ad esempio, se la parola è al'interno di un tag
<b>
e di un'ancora
<a href="documento">
, la struttura avrà un valore diverso da 0 nel campo
bold
e un puntatore alla stringa
"documento"
nel campo
file_link
, oltre alla posizione della parola e alla posizione del link (pari al numero d'ordine dell'ancora contenente il link nell'ipertesto) nei corrispondenti campi. In maggior dettaglio, la
next_word
ritorna un valore del tipo
struct info_word {
char *parola; /* parola */
int word_pos; /* posizione parole nel file */
int title; /* vero se parola nel titolo */
int italic; /* vero se parola in corsivo */
int bold; /* vero se parola in grassetto */
size word_size; /* dimensione*/
char *file_link; /* in caso di link attivo, contiene il nome
della pagina (file) del link */
int link_pos; /* posizione del link nel file */
};
contenente i seguenti valori:
- il campo
parola
contiene la stringa della parola letta;
- il campo
word_pos
contiene la posizione nell'ipertesto della parola letta (pari al numero d'ordine della parola, ovvero, al numero di parole che la precedono più 1);
- il campo
title
è diverso da 0 se la parola è nel titolo (dentro una coppia di tag <title> </title>
) e 0 se si trova nel body (dentro una coppia di tag <body> <body>
) o in un'altra parte del documento;
- il campo
italic
è diverso da 0 se la parola è in corsivo (dentro una coppia di tag <i> </i>
);
- il campo
bold
è diverso da 0 se la parola è in corsivo (dentro una coppia di tag <b> </b>
);
- il campo
word_size
contiene la dimensione della parola, ovvero un valore compreso in normal
, small
(parola dentro coppia di tag <small> </small>
) o large
(parola dentro coppia di tag <large> </large>
);
- il campo
file_link
contiene un puntatore alla stringa del link assocato all'ancora (coppia di tag <a> </a>
) dentro cui appare la parola, o NULL
se non ci sono link associati alla parola;
- il campo
link_pos
contiene il numero di ancore che precedono la parola (inclusa, eventualmente quella dentro cui si trova la parola).
Tutta la memoria della struttura ritornata, inclusa la stringa con la parola letta e la stringa dell'eventuale link sono nuove e allocate dinamicamente all'interno della funzione
next_word
.
La
next_word
rende trasparente al programma la utilizza i tag presenti nel documento; ad ogni nuova lettura, la
next_word
mantiene le informazioni sugli attributi attivi in quel momento, legge i tag che precedono la successiva parola aggiornando gli attributi della paorla e infine legge la parola.
Il precedente funzionamento della
next_token
rende molto semplice la lettura delle parole, ma rende non immediato l'inidividuazione dei link presenti nel testo, se si vuole evitare di considerare più volte i link associati ad ancore che contengono più di una parola. Ad esempio, se si ha
<a href="documento">vai al link</a>
per tutte e tre le parole "vai", "al" e "link"
next_word
restituisce la stringa
"documento"
nel campo
file_link
. È però ovvio che per quanto riguarda la molteplicità del link, questa ancora deve portare solo ad un incremento di 1. Per individuare il punto in cui viene letto un nuovo link si può utilizzare il campo
link_pos
restituito ad ogni lettura di una parola. Questo campo ritorna sempre il numero di link letti sino a quel punto, quindi, la lettura di un nuovo link può essere facilmente individuata osservando che il valore di
link_pos
è aumentato rispetto a quello ritornato dalla precedente chiamata di
next_word
.
Esempio di utilizzo del parser
Il file
test-parser.c
contiene un main per la verifica del funzionamento del parser. Il programma analizza una lista di file passati sulla linea di comando o stdin nel caso di lista vuota. Per ogni file letto viene stampata la lista delle parole (e dei corrispodeti attributi) lette, inoltre, alla fine viene stampata la sequenza ordinata dei link torvato nel file, riportando per ciascun link il suo numero d'ordine e la sua posizione nell'ipertesto.
Ritorna alla pagina del progetto
--
StefanoGuerrini - 04 May 2005