---+++ Il Parser La funzione <pre> struct info_word *next_word(FILE *fp);</pre> 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 <pre> FILE *open_ipertesto(char *fname);</pre> 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 <pre> FILE *close_ipertesto(char *fp);</pre> ---++++ 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<nop>="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 <pre> 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 */ }; </pre> 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 <pre><a href="documento">vai al link</a></pre> 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 =[[http://www.dsi.uniroma1.it/~guerrini/LabProg/Progetto-0405/src/test-parser.c][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. ---- [[ProgettoLab0405][Ritorna alla pagina del progetto]] -- Users.StefanoGuerrini - 04 May 2005
This topic: Labprog2pz
>
WebHome
>
ProgettoLab0405
>
NextWord
Topic revision: r4 - 2005-05-05 - StefanoGuerrini
Copyright © 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