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


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