Domande sul Modulo 1 (analizzatore lessicale di file xsML)

In questa pagina potete porre domande sul Modulo 1 del progetto 2006/2007.

Vi prego di inserire un titolo che chiarisca che tipo di domanda state ponendo. Potete rispondere alle domande anche tra di voi.



Benvenuti

Questo è il primo messaggio sulla pagina delle domande riguardanti il modulo 1 del progetto. Per favore, leggete bene le specifiche e le domande degli altri prima di fare domande ovvie.

-- RobertoNavigli - 28 Mar 2007

Chiarimento sull'uso della realloc()

Salve, il dubbio riguarda, come dice il titolo stesso, l'uso della funzione realloc(), in quanto e' stato asserito da molti che l'uso di quest'ultima e' da sconsigliare per vari motivi: piu' di tutti il peso che essa ha nell'esecuzione. L'alternativa sarebbe, tramite uso di un puntatore file creato ad hoc, contare la quantita' di caratteri da allocare tutti tramite uso di una singola malloc() [e non carattere per carattere con la realloc()]. Il dubbio che mi sorge e', che dato che anche l'alternativa sembra essere piuttosto dispendiosa, quale dei due metodi conviene usare di piu'.

Grazie in anticipo per il chiarimento.


-- ValerioAndreocci - 28 Mar 2007

Re: Chiarimento sull'uso della realloc()

usa la realloc è il modo migliore usandola non ho avuto problemi specie nel trattare le stringhe nel file

-- AlessandroMastropietro - 28 Mar 2007

Re: Chiarimento sull'uso della realloc()

Quando superate la dimensione di un buffer (caso raro, perché difficilmente succederà che un token superi una dimensione, che so, di 255 o 1024 byte), utilizzate la realloc. Ma attenzione: non riallocate carattere per carattere!!!

-- RobertoNavigli - 29 Mar 2007

Inizializzazioni e funzioni standard

volevo chiederle a che valore deve essere inizializzata la "state" e inoltre nel .h compare ERR_BAD_ARG = 1; ma nelle specifiche c'è scritto che gli errori devono essere interi negativi. Ultima domanda se ci sono funzioni standard per le stringhe che non devono essere usate.

-- EltonBushati - 28 Mar 2007

Re: Inizializzazioni e funzioni standard

Lo state va inizializzato a LEX_STATE_CONTENT, visto che ancora non abbiamo incontrato un carattere <. I codici di errore sono effettivamente positivi: va bene così, ma voi userete comunque le costanti, quindi non andrete a leggere il valore numerico di ognuno di questi. Non ci sono funzioni standard che non possono essere usare (purché siano standard).

-- RobertoNavigli - 29 Mar 2007

Uso di altre funzioni

Ciao, volevo sapere se oltre alle funzioni da implementare, si possono realizzare altre funzioni ausiliarie (da richiamare solo ed esclusivamente nelle funzioni principali) oppure si devono implementare solo le funzioni fornite

-- DarioLaPadula - 28 Mar 2007

Re: Uso di altre funzioni

Sì, è possibile utilizzare altre funzioni di appoggio. L'importante è che implementiate le tre funzioni richieste.

-- RobertoNavigli - 28 Mar 2007

ERR_BAD_ARG nella funzione close_lexical_analyzer

Nelle specifiche c'è scritto che la funzione close_lexical_analyzer deve restituire ERR_BAD_ARG se "i valori nei campi di *pla non sono corretti". Cosa dobbiamo controllare di questi valori??

-- MarcoMarinangeli - 28 Mar 2007

Re: ERR_BAD_ARG nella funzione close_lexical_analyzer

Per esempio, se pla->file == NULL.

-- RobertoNavigli - 28 Mar 2007

Riconoscitore

Il riconoscitore deve aspettarsi come primo carattere un < oppure se il file comincia con qualsiasi altro carattere, fino al carattere <, deve essere considerato tutto un token di tipo STRING?


-- GiuseppeLaTorre - 29 Mar 2007

Re: Riconoscitore

L'analizzatore lessicale deve solo emettere l'elenco dei token. Sarà poi l'analizzatore sintattico a controllare che il file inizia con un token di tipo OPEN_START_TAG.

-- RobertoNavigli - 29 Mar 2007

carattere \n nei tag e STRING

Salve ho due domande da porre: Il fatto che io incontri un \n all'interno di un tag è legale (quindi va ignorato come ignoro gli spazi bianchi all'interno del tag) o va gestito come errore di tipo ERR_INVALID_TOKEN? Poi avrei un'ulteriore domanda: all'interno del contenuto degli elementi, se io incontro una situazione del tipo:

il documento ecc > ecc ecc

devo dividerlo nel seguente modo:

PRIMO TOKEN: TERZO TOKEN: "il documento ecc \n " QUARTO TOKEN: > QUINTO TOKEN: " ecc ecc\n" SESTO TOKEN: </documento SETTIMO TOKEN: > e poi sarà l'analizzatore sintattico che si occuperà dell'errore oppure devo considerare il carattere > come parte della STRING. Quindi: PRIMO TOKEN: TERZO TOKEN: "il documento ecc \n > ecc ecc\n" QUARTO TOKEN: </documento QUINTO TOKEN: > Grazie mille


-- LauraMinicucci - 29 Mar 2007

Re: carattere \n nei tag e STRING

Per la prima domanda: Un simbolo \n all'interno di un tag è legale. Non bisogna emettere errore. Per la seconda domanda: sarà l'analizzatore sintattico ad emettere errore. I simboli < e > sono speciali, per cui individuano un nuovo token che deve essere emesso. E' chiaro che se dopo il < trovo uno spazio, allora questo errore può essere emesso dall'analizzatore lessicale come un carattere inatteso.

-- RobertoNavigli - 29 Mar 2007

STRING e carattere >

La seconda parte del messaggio non è chiara. Volevo sapere se nel contenuto di un elemento trovo il carattere > devo memorizzarlo come token CLOSE_TAG oppure lo considero come parte del contenuto dell'elemento e quindi continuo a memorizzare il contenuto? Grazie

-- LauraMinicucci - 29 Mar 2007

Re: STRING e carattere >

Bisogna emettere un token CLOSE_TAG.

-- RobertoNavigli - 29 Mar 2007

TOKEN campo text

Buongiorno, non mi è chiara una cosa, nel campo text della struct token sicuramente devo mettere il nome del tag, il nome di un attributo o una stringa, ma se il token è un equal o un close_tag, devo associare i rispettivi char = e > oppure metto il puntatore a NULL? Grazie

-- DeliaPassalacqua - 29 Mar 2007

Re: TOKEN campo text

Vanno bene entrambe le cose, comunque in quel caso il campo text non verrà stampato dal main (che trovate sulla pagina delle specifiche).

-- RobertoNavigli - 29 Mar 2007

invalid token ed EOF

Salve avrei 2 domande da porre:

1) le regole che determinano valido un NAME, valgono anche per il nome di un tag?

2) quando arrivo all'eof, ed ho quindi finito di analizzare il testo xsml, devo ritornare EOF, valore diverso da 0, che fa quindi terminare il do while del main?


-- ElenaAgostini - 29 Mar 2007

Re: invalid token ed EOF

1) Legga bene le specifiche: le regole per il nome di un tag sono scritte nel paragrafo "Le regole della suddivisione in token"

2) Emetto comunque ERR_EOF (guardate il main.c)


-- RobertoNavigli - 29 Mar 2007

Re: invalid token ed EOF

Ciao, se ho capito bene se trovi un EOF devi tornare ERR_EOF che è un valore diverso da 0 (è 4) questo ti fa terminare il ciclo while. Ciao...

-- DeliaPassalacqua - 29 Mar 2007

Re: Re: invalid token ed EOF
Se il primo carattere che incontro è un EOF, nel campo text devo memorizzare tutte le informazioni lette prima dell'EOF, ma in questo caso non ce ne sono. Token_type lo setto ad ERROR, ma cosa metto nel campo text, visto che poi il main ne stampa comunque il contenuto (generando segmentation fault)?

-- DeliaPassalacqua - 29 Mar 2007

Re: Re: invalid token ed EOF

Va bene NULL o la stringa vuota "". Correggiamo il file main.c.

-- RobertoNavigli - 29 Mar 2007

ERR_BAD_ARG su stringa vuota

Professore stavamo sviluppando la funzione new_lexical_analyzer quando ci siamo accorti di qualcosa che non quadra.. poco dopo il main ci sono le seguenti righe di codice:

if (argc = 2) {

printf("Uso
lex_an \n"); return 1; }

se noi nella funzione andiamo ad analizzare gli errori, come richiesto otteniamo che a causa di quel return 1 la condizione ERR_BAD_ARG su stringa vuota viene automaticamente scartata, xke se noi mandiamo in esecuzione il programma in questo modo "./main" (SENZA ARGOMENTO) invece di restituire> ERR_BAD_ARG, mostra "Uso: lex_an " uscendo correttamente da programma (a causa del return 1).

E' normale la presenza di quel RETURN 1 o qualcosa non va?

Grazie


-- FlavioPietrelli - 29 Mar 2007

Re: ERR_BAD_ARG su stringa vuota

La funzione deve emettere ERR_BAD_ARG se riceve, ad esempio, una stringa vuota in ingresso. Il fatto che il main che abbiamo metto in linea esca prima se non specifico il primo parametro non vieta che la funzione si comporti in quel modo, quindi dovete comunque prevedere quel caso.

-- RobertoNavigli - 29 Mar 2007

Doppia apertura

Salve, se mi trovassi nel caso di <<document devorestituire errore?

-- DanieleR - 30 Mar 2007

Re: Doppia apertura

Sì, ma solo perché il primo carattere < si aspetta subito dopo un carattere valido come nome del tag.

-- RobertoNavigli - 29 Mar 2007

spazio

e potrei anche avere < document? e in questo caso che faccio?

-- DanieleR - 30 Mar 2007

Re: spazio

Come sopra, il token che inizia con < deve poi avere subito dopo un nome di tag. Dato che il nome non può iniziare per spazio, bisogna emettere errore.

-- RobertoNavigli - 29 Mar 2007

memoria statica_riconoscimento name_attributi

Ciao a tutti queste sono le mie domande:

1) la memoria dinamica va usata per forza? cioè, è possibile mettere i singoli caratteri dentro ad un array e poi fare per esempio token->text=array. così facendo useremmo solo la memoria statica.

2) se trovo per esempio:

<documento id="34" ciao >
la stringa ciao seve essere considerata token di tipo STRING o di tipo NAME oppure devo restituire un errore?

3) i valori di un attributo devono essere per forza delimitati da quote o apici? es.: id="34" e id='34' oppure anke id=34?


-- GianlucaSquarcia - 30 Mar 2007

Re: memoria statica_riconoscimento name_attributi

Rispondo alle domande:

1) attenzione: non è bene copiare l'indirizzo di un array statico dentro un puntatore. Se voglio conservare (per qualche ragione) due token, entrambi punterebbero allo stesso buffer.

2) direi che ciao è un token di tipo NAME. Non devono essere emessi errori, dato che si tratta di un errore sintattico.

3) nel caso id=34 id e 34 sono di tipo NAME (non STRING, poiché non è racchiuso da apici né da virgolette) e = è di tipo EQUAL.


-- RobertoNavigli - 29 Mar 2007

Re: Re: memoria statica_riconoscimento name_attributi
Salve. nella risposta al punto 3) "nel caso id=34 id e 34 sono di tipo NAME (non STRING, poiché non è racchiuso da apici né da virgolette) e = è di tipo EQUAL" si legge che anche 34 è di tipo NAME ma nelle specifiche c'è scritto che dovrebbe essere di tipo STRING. Qual'è la cosa corretta? Grazie

-- AndreaMencaroni - 03 Apr 2007

Re: Re: Re: memoria statica_riconoscimento name_attributi

Riporto direttamente dalle specifiche:

"Quando l’analizzatore lessicale scandisce l’input, il primo carattere che trova (diverso da spazio se all’interno di un tag) gli permette di individuare il tipo del successivo token presente in input. Ad esempio, un carattere alfabetico indica che il successivo token sarà un NAME, gli apici che sarà una stringa, e così via."


-- RobertoNavigli - 04 Apr 2007

Bufferizzazione

Vorrei sapere se è lecito allocare un'area di memoria, ad esempio di 1024 bytes, per poterci "scaricare" una linea (fgets) del file xml e quindi andare ad analizzare la linea per estrarre i token. Grazie

-- AndreaMencaroni - 30 Mar 2007

Re: Bufferizzazione

Certo. Però bisogna tenere conto che un tag potrebbe trovarsi su due o più righe diverse, ad esempio:

<documento id="id10"
                  titolo = "20"
>

In alternativa si può leggere carattere per carattere (fgetc).

-- RobertoNavigli - 29 Mar 2007


ERRORI INTERNI AL TAG

Se mi provassi in <document id="2" e invece ke "id" avessi un numero, tipo: <document 12="2" che errore devo emettere? invalid token?

-- DanieleR - 30 Mar 2007

Re: ERRORI INTERNI AL TAG

Deve emettere l'errore associato al fatto che il token NAME contiene un carattere non valido (visto che non può iniziare con una cifra).

-- RobertoNavigli - 30 Mar 2007

The end...

Salve vorrei gentilmente sapere quando metterete online la pagina x l'uploading...e quando verrà dato il main che verificherà dettagliatamente anche la gestione degli errori. Ossia quello poi utilizzato per la valutazione dei progetti.

-- GiuseppeLaTorre - 30 Mar 2007

Re: The end...

Il main che utilizzeremo è quello che trovate online. Prepareremo dei file xsML e dei risultati "attesi" per ogni file che confronteremo con quelli restituiti dal main utilizzando le vostre funzioni. Non è un test di autovalutazione, per cui voi non disporrete delle risposte che noi utilizzeremo per valutarvi. In compenso, sto per mettere online dei file xsML che potete utilizzare per provare il vostro codice (ma che non vi garantiscono che tutti i casi siano stati effettivamente presi in considerazione da voi - ergo: dovete fare altri test per conto vostro).

-- RobertoNavigli - 30 Mar 2007

Sistema operativo??

su quale sistema operativo verranno effettuati i vostri test?

-- GianlucaSquarcia - 30 Mar 2007

Re: Sistema operativo??

Su linux, compilando con gcc. Vi consiglio quindi di provare a compilare il tutto con gcc periodicamente ed eseguire i vostri test sul risultato di quella compilazione.


-- RobertoNavigli - 29 Mar 2007


contenuto degli elementi (STRING)

Nel contenuto degli elementi, se incontro il carattere = lo salvo come token EQUAL oppure lo memorizzo come parte del contenuto dell'elemento?

-- LauraMinicucci - 31 Mar 2007

Re: contenuto degli elementi (STRING)

Nelle specifiche è scritto chiaramente: lo memorizzo come parte del contenuto.


-- RobertoNavigli - 29 Mar 2007


ERRORI INTERNI AL TAG parte 2°

Se nel tag incontro uno degli errori scritti di seguito comunque devo andare avanti nella scansione? Inoltre il ptk->type come lo devo settare? su ERROR?

1) <doc 1234567890="ciccio bello"> // errore NAME
2) <.doc id="ciccio bello">        // errore START TAG
3) <doc id=>                       // errore assenza STRING
4) <doc id="(EOF)                  // errore SRING non chiusa

-- DanieleR - 31 Mar 2007

Re: Re: contenuto degli elementi (STRING)
e se nel contenuto incontro un > (close tag), anche esso entra a far parte del contenuto o lo segnalo come close tag?

-- ElenaAgostini - 31 Mar 2007

Re: Re: Re: contenuto degli elementi (STRING)
Se incontri un > nel contenuto lo salvi come CLOSE_TAG è una domanda che già ho posto e mi hanno risposto così

-- LauraMinicucci - 31 Mar 2007

DUBBIO SU ERRORE

dopo l'accoppiata nome=valore bisogna generare un errore se non c'è nessuno spazio dopo le virgolette del valore? Per es. deve generare un errore oppure deve leggere2,5 OPEN_START_TAG "documento" 2,16 NAME "id" 2,18 EQUAL "(null)" 2,19 STRING "1" 2,22 NAME "provola" 2,29 STRING "provoletta" 2,41 CLOSE_TAG "(null)"
dopo l'accoppiata nome=valore bisogna generare un errore se non c'è nessuno spazio dopo le virgolette del valore? Per es.
<documento id="1"provola"provoletta"> deve generare un errore oppure deve leggere2,5    OPEN_START_TAG    "documento"
2,16    NAME    "id"
2,18    EQUAL    "(null)"
2,19    STRING    "1"
2,22    NAME    "provola"
2,29    STRING    "provoletta"
2,41    CLOSE_TAG    "(null)"
-- ValerioSecondini - 31 Mar 2007

ALTRO DUBBIO

nel metodo get_next_token() è un errore non generare ERR_GENERIC ed ERR_INPUT in nessun caso? Non sono riuscito a capire in quali casi dovrei generare questi errori

-- ValerioSecondini - 31 Mar 2007

USO MAIN.C

vorrei sapere con quali parametri va chiamata la funzione main data dal professore..

-- LucaDiFilippo - 31 Mar 2007

Re: USO MAIN.C

Basta guardare il codice della funzione main per capirlo...

-- RobertoNavigli - 02 Apr 2007

stdlib.h e tag <?xml

Serve usare le funzioni malloc, realloc e free ma non è presente l'inclusione della stdlib.h nel .h e nel main.c forniti... quindi? smile

Poi immagino non si debba prendere in considerazione l'eventualità di incontrare sulla prima riga il tag <?xml ma chiedo per conferma se ho dedotto bene.


-- OliverTran - 31 Mar 2007

Re: stdlib.h e tag <?xml

1) E nel file xsml_lex.c??

2) No, l'intestazione <?xml non è prevista nel linguaggio xsML


-- RobertoNavigli - 01 Apr 2007

DELUCIDAZIONI

Compilando il file main.c con l'opzione -Wall si hanno dei warning che, in quanto tali, possono ritenersi trascurabili, ma lo sono veramente? In una STRING all'interno di un TAG, in pratica bisogna emettere un errore solo se si incontra un carattere < o > o EOF? Es.: (emette errore perchè c'è il carattere < che impedisce la corretta chiusura del token STRING?)


-- GiuseppeLaTorre - 01 Apr 2007

Re: DELUCIDAZIONI

"warning: suggest parentheses around assignment used as truth value"

Il compilatore suggerisce di usare le parentesi, perche' le assegnazioni che compaiono nelle condizioni dei due if, sono considerate come dei valori veri. Possono ritenersi trascurabili ma a mio parere inserirei le parentesi.

1) if (error_code = new_lexical_analyzer(argv[1], &la))

2) if (error_code = close_lexical_analyzer(&la))

-- MarcoRotiroti - 01 Apr 2007

Re: Re: DELUCIDAZIONI
Il warning e' legato al fatto che un'assegnazione compare in un posto dove normalmente ci si aspetta un test.

Il problema quindi non e' tanto legato alla mancanza di parentesi, ma al fatto che per errore si potrebbe aver scritto = al posto di ==.

Personalmente, una volta ho perso piu' di una settimana a trovare un errore del genere in un progetto abbastanza complesso che stavo sviluppando. Si tratta di piu' di 15 anni fa, quando si lavorava con strumenti di sviluppo meno sofisticati, ma questo tipo di situazioni possono essere molto subdole.

Una maniera pulita per scrivere il test e' (un purista eliminerebbe del tutto l'assegnazione all'interno del test):

if ((error_code = new_lexical_analyzer(argv[1], &la)) != 0)

In questo caso e' evidente che l'= non e' stato scritto per sbaglio, ma e' esattamente cio' che si voleva, ed infatti non viene prodotto alcun warning.

Purtroppo, per pigrizia, molto spesso si scrivono i test in modo compatto. Come ad esempio, verificando il valore di un puntatore. Spesso si preferisce

if (!p)

per dire

if (p == NULL)

Concettulamente, e' un piccolo errore, perche' prevede un casting implicito del puntatore ad un valore intero, ma orami e' largamente accettato e lo trovate sia nell'uso che sui testi. Personalmente, preferisco sempre la forma piu' estesa, perche' piu' chiara.


-- StefanoGuerrini - 02 Apr 2007

FLAGS di compilazione

Salve, volevo sapere se quando compiliamo possiamo utilizzare i seguenti flags:

-std=c99 -pedantic oppure dobbiamo compilare con:

-ansi -pedantic


-- MarcoRotiroti - 01 Apr 2007

Token STRING

1. Vorrei avere conferma del fatto che se noi incontriamo all'inizio del documento XsML dei caratteri prima di un token <, questi debbano essere considerati come TOKEN STRING, quindi se mi trovo in situazioni come la 1) e 2), tutto ciò che si trova prima di <, è una stringa.

2. Inoltre non mi è chiaro se nella stringa, oltre ai caratteri < e >, dobbiamo escluderne altri, ad esempio considerare solo quelli stampabili, ecc.

Grazie.

1) \n    =;;{   <             (prima di < c'è un Token STRING)  
2) =<                         (prima di < c'è un Token STRING)
-- GloriaRomualdi - 01 Apr 2007

Re: Token STRING

In linea di principio il tokenizzatore non sa se sta all'inizio del doumento, in mezzo o alla fine.

Per come ve lo abbiamo impostato nel progetto, l'analizzatore ha due stati, interno o esterno a un tag. A seconda dello stato in cui si trova l'analizzatore riconoscera' certi tag oppure no. Qualsiasi altra considerazione (tipo so che sto all'inizio del file) nell'implementazione della funzione che acquisisce il token successivo, puo' portare ad errori.

Per quanto riguarda invece la funzione che apre e inizializza l'analizzatore, occorre solo ragionare su qual e' lo stato in cui si trova l'analizzatore al momento della sua creazione. Dato che gli stati sono due e non puo' trovarsi all'interno di un tag, la risposta mi sembra forzata.

Tutto il resto viene di conseguenza.


-- StefanoGuerrini - 02 Apr 2007

cosa è valido in string?

non mi è chiaro quali siano i caratteri validi. il tipo string è sia il valore dell'attributo del tag, sia il testo contenuto. ho interpretato così: nel caso in cui sia un attributo, si comporta come un name, ma può essere anche un numero. quando invece è il contenuto, va bene qualsiasi carattere. è corretto?

1) " asd" corretto?
2) " asd " corretto?
3) " " corretto?
4) "" corretto?
-- SimoneMori - 01 Apr 2007


free

Non mi è chiaro l'utilizzo della free nel get_next_token() o meglio va messo appena entriamo nel metodo controllando che abbiamo già letto qualkosa o dobbiamo fare in modo diverso
if(pla->colonna!=1&&pla->riga!=1)
    free(ptk->text);

-- AlessandroMastropietro - 02 Apr 2007

re: free

Il token viene passato in ingresso alla funzione get_next_token per essere riempito, non per essere liberato...

-- RobertoNavigli - 02 Apr 2007

Re: Free

Anch'io ho pensato a questo problema. A questo punto la gestione della memoria spetta a chi utilizza la libreria....

-- AlbertoRivelli - 03 Apr 2007

Re: Free

...in parte

-- AlbertoRivelli - 03 Apr 2007

Problema nel main

Ma nel caso che trovi un' errore ad esempio un EOF alla fine di un clos_tag il vostro main mi stampa prima il clos_tag poi rientra trova eof ristampa l'ultimo tag che gli è rimasto in memoria e poi esce ma questo non è un errore?????

-- AlessandroMastropietro - 02 Apr 2007

Re: Problema nel main

Non stampa l'ultimo token che gli è rimasto in memoria: stampa il token di errore (con la posizione aggiornata, ecc.) impostato quando incontro un EOF.

-- RobertoNavigli - 02 Apr 2007

\t e contatore di riga e colonna

\t quanto dobbiamo incrementare il contatore della riga?

-- SimoneMori - 02 Apr 2007

Re: \t e contatore di riga e colonna

\t è un carattere come tutti gli altri: incrementiamo di 1 carattere.

-- RobertoNavigli - 02 Apr 2007

Come gestire le tabulazioni

Se incontro un carattere \t o \v cosa devo fare?ogni computer sembra saltare un numero di spazi arbitrari quando premo TAB.Perciò se ne trovo uno quante righe devo procedere in avanti e in basso(nel caso della verticale)

-- PatrizioTamorri - 02 Apr 2007

Re: Come gestire le tabulazioni

\t è semplicemente un carattere come gli altri. Essendo un carattere di tabulazione, ognuno lo visualizza con un numero a scelta di spazi, ma rimane un singolo carattere. Vado avanti di una colonna (non riga). \v trascuratelo.

-- RobertoNavigli - 04 Apr 2007

Dubbio EOF

Salve. Avrei bisogno di un'ulteriore precisazione riguardo l'EOF: nel caso vi sia un EOF prima della fine di un token segnalo l'evento come errore; devo fare lo stesso (segnalarlo token ERROR, e quindi considerarlo come carattere a parte) anche quando incontro l'EOF in modo regolare come nell'esempio di codice?oppure una volta arrivata all'ultimo CLOSE_TAG, analizzo il carattere successivo e invece di tornare 0 ritorno ERR_EOF direttamente causando l'uscita dal do while nel main?
<tag>string</tag>EOF
-- ElenaAgostini - 02 Apr 2007

Re: Dubbio EOF

No, l'EOF è un token a parte.

-- RobertoNavigli - 04 Apr 2007

ERRORI TAG

se dopo <doc id finisce il mio file devo restituire 1,6 ERROR "id" Errcode 4? o devo stampare i token fino a id e poi segnalare l'eof?

-- DanieleR - 03 Apr 2007

Re: ERRORI TAG

Id devo essere restituito come token. Il token successivo sarà poi quello con l'EOF.

-- RobertoNavigli - 03 Apr 2007

Token STRING seguito da EOF

Nel caso il file xsml termini (o sia esclusivamente composto da) una stringa seguita da EOF (ex: "info" e EOF), come devo valutare i token? Come uno STRING seguito da errore EOF o il token string è trasformato in errore da EOF? Non mi è parso di trovare informazioni riguardo questo particolare caso nelle specifiche e mi sembra più logico il primo caso, ma per sicurezza... wink

-- OliverTran - 03 Apr 2007

Re: Token STRING seguito da EOF

Seguirei quello che mi dice la logica...


-- RobertoNavigli - 04 Apr 2007

"\n" in un open_start_tag

se ho una cosa del genere:

<docu\n mento

il programa deve generare due token,(l'errore sarà nel caso rilevato dall'analizz.lessicale) ovvero:

"docu" OPEN START TAG 1,1 "mento" NAME 2,1

oppure:

"documento" START TAG 1,1

cioe ignorare l'andata a capo

o dare un errore nel token documento??


-- JacopoSciarra - 03 Apr 2007

Re: "\n" in un open_start_tag

'\n' è un carattere separatore, per cui se vado a capo devo terminare il token. In altre parole, la suddivisione corretta è la seguente:
"docu" OPEN START TAG 1,1
"mento" NAME 2,1

-- RobertoNavigli - 04 Apr 2007

Chiarimento su dubbio

dopo l'accoppiata nome=valore bisogna generare un errore se non c'è nessuno spazio dopo le virgolette del valore? Per es.
<documento id="1"provola"provoletta"> deve generare un errore oppure deve leggere2,5    OPEN_START_TAG    "documento"
2,16    NAME    "id"
2,18    EQUAL    "(null)"
2,19    STRING    "1"
2,22    NAME    "provola"
2,29    STRING    "provoletta"
2,41    CLOSE_TAG    "(null)"

-- ValerioSecondini - 04 Apr 2007

Re: Chiarimento su dubbio

Sì, la mancanza di spazio causa un errore: all'interno di un tag, non posso terminare una stringa con le " e poi scrivere subito dopo un carattere.

-- RobertoNavigli - 04 Apr 2007

CLOSE TAG

In quale di questi casi restisuisco errore invalid token?
1) <doc id>
2)  <doc id=>
3) <doc>>

-- DanieleR - 04 Apr 2007

Re: CLOSE TAG

Nessuno dei tre. Un token non è valido quando i caratteri che uso per codificarlo non sono ammessi. Qui ci sono tutti token validi.

-- RobertoNavigli - 04 Apr 2007

CLOSE TAG 2

Se non è errore 1 allora non lo è neanke 2?
1) <doc id=>
2) <doc id= value= ciao= >
-- DanieleR - 04 Apr 2007

Re: CLOSE TAG 2

No, devo emettere tutti i token validi. Gli errori li emetterà l'analizzatore sintattico (modulo 3), che si accorgerà che dopo il token = deve essere un token di tipo STRING, ecc.

-- RobertoNavigli - 04 Apr 2007

Compilazione

Salve a tutti. Attualmente per provare il modulo ci dobbiamo servire del file .h e del main.c oltre che del modulo1.c che creeremo. Come faccio a compilare questi 3 file come progetto unico con gcc o make? Tutti gli IDE di programmazione che ho provato (eccetto il dev che però gira solo su windows), quali Anjuta, Code::Blocks, KDevelop, mi danno errore in fase di generazione del progetto perchè gli manca il makefile. Ho visto che creare makefile è difficilino quindi prima di addentrarmi, chiedo a voi tutti il metodo migliore da seguire. Grazie

-- MirkoSquitieri - 04 Apr 2007

Re: Compilazione

Ciao, per compilare con gcc devi dare il seguente comando

gcc -o nome_eseguibile main.c get_next_token.c  new_lexical_analyzer.c close_lexical_analyzer

-- DeliaPassalacqua - 05 Apr 2007

Re: Re: Compilazione IMPORTANTE
Ragazzi, vi consiglio di consegnare un solo file (chiamato xsml_lex.c) con le tre funzioni implementate.


-- DeliaPassalacqua - 05 Apr 2007

ERRORI VARI

ok assodato che 1 e 2 sono giusti, lei in pasato aveva detto che se avevamo 3 o 4 però era errore, o sbaglio?
1) <doc id=>
2) <doc id= value= ciao= >
3) <doc "2"
4) <doc =
-- DanieleR - 04 Apr 2007

Re: ERRORI VARI

ah dimenticavo 5, anxhe questo è errore o no?
5) <doc id"2"
-- DanieleR - 04 Apr 2007

Re: Re: ERRORI VARI
Non mi chiedete i singoli casi specifici: quello che ho detto vale in generale. Se un token è corretto a livello lessicale, anche se non lo è a livello sintattico (cioè al livello della sua collocazione rispetto agli altri token), devo emetterlo senza errore. E' chiaro che il caso 5 non rientra con questa situazione, perché non posso usare le virgolette all'interno del nome di un attributo.


-- RobertoNavigli - 04 Apr 2007

Dubbi

Per come sono strutturate le 3 funzioni da implementare, si capisce che ptk->text non può essere liberata con una free perchè la stringa viene utilizzata al di fuori delle 3 funzioni. Quindi chi usa la funzione get_next_token è responsabile di deallocare la memoria allocata. In alternativa si potrebbe aggiungere un parametro di tipo token nelle funzioni int new_lexical_analyzer(char *fname, lex_an *pla) e int close_lexical_analyzer(lex_an *pla), in modo da gestire al meglio l'allocazione e la deallocazione di memoria (oppure basterebbe aggiungere alla struct lex_an il campo di tipo token, così da poter risalire a ptk->text per allocarlo e deallocarlo correttamente). Inoltre per realizzare un'allocazione efficiente facendo un uso attento della realloc (come nell'esempio realloc3.c) sarebbe opportuno avvalersi di un ulteriore parametro (per esempio int size) nella funzione get_next_token, altrimenti si dovrebbe ricorrere all'utilizzo di una variabile extern.


-- GiuseppeLaTorre - 04 Apr 2007

sugli errori

Dalle specifiche, pag.7: "nessun token puo cominciare con una cifra decimale o con i caratteri . o -". E un token di tipo STRING?!

-- CleoniceMansillo - 04 Apr 2007

Re: sugli errori

Si parla di token di tipo diverso da STRING, ovviamente.

-- RobertoNavigli - 04 Apr 2007

File di input

potreste mettere in rete dei file con cui fare test di funzionamento del programma? sarebbe utile avere anche le eventuali soluzioni(posizioni nel file, tipo di token, testo del token).

-- GianlucaSquarcia - 04 Apr 2007

DUBBIO 2

nel metodo get_next_token() è un errore non generare ERR_GENERIC? ed ERR_INPUT? in nessun caso? Non sono riuscito a capire in quali casi dovrei generare questi errori

-- ValerioSecondini - 04 Apr 2007

EOF e contenuto elementi

Se mi trovo all'interno di un elemento e incontro un EOF l'intera stringa farà parte del token ERROR con ERROR_CODE 4, giusto?

Ossia da input tizio caio e sempronio (EOF)

avrò output 4,0 ERROR "tizio caio sempronio" get_next_token() ERROR_CODE = 4

perchè il contenuto di un elemento è tutto ciò che va da > a <, giusto? Quindi c'è un errore perchè il token non è concluso...


-- DeliaPassalacqua - 04 Apr 2007

Token error

Se trovo un errore del genere <, l'output che devo restituire è il seguente?
1,122   ERROR   ","
get_next_token() ERROR_CODE = 5


-- DeliaPassalacqua - 05 Apr 2007

Re: Token error

Ripeto: l'analizzatore lessicale sa solo quali sono i token, non quali token aspettarsi a seguito del riconoscimento di un token. Quindi quello di puro testo è un token valido, che deve essere emesso indipendentemente da quello che viene dopo. -- RobertoNavigli - 07 Apr 2007

stampa di output

quando il main fa stampare in output le varie stringhe dei vari token, nel caso in cui si abbia un'andata a capo nella stringa, in output si deve andare a capo o stampare su sempre su una riga usando la notazione \n ?? il mio programma va a capo anche nell'output. E' un problema??

Nell'esempio sulle specifiche stampa \n ma come faccio a far stampare \n invece di farlo andare a capo? serve una funzione apposta?


-- JacopoSciarra - 05 Apr 2007

Re: stampa di output

mi e venuto lo stesso dubbio ma mi e sembrato piu logico lasciarlo cosi che far stampare \n

-- AlbertoRivelli - 06 Apr 2007

Re: stampa di output

Esatto, non dovete stampare la stringa "\\n", ma dovete lasciare tutto com'è: se c'è un carattere '\n', vorrà dire che la stringa va a capo. Questo è perfettamente lecito. Non dovete alterare la stringa, dovete semplicemente stamparla.

-- RobertoNavigli - 08 Apr 2007

Dubbio sullo stato

scusate se faccio questa domanda perchè so che è già stata discussa a lezione, ma ho ancora dubbi su quando ci si trova in state=LEX_STATE_CONTENT e su quando invece ci si trova in state=LEX_STATE_TAG

-- LucaDiFilippo - 06 Apr 2007

Get_next_token: errori diversi da ERR_INVALID_TOKEN

Nel caso in cui incontriamo un errore del tipo ad esempio ERR_BAD_ARG, dobbiamo comunque inizializzare i campi di ptk? Perchè il main stampa comunque i campi di ptk e ciò genera SIGSEGV. Il problema è che l'errore è stato generato prima di leggere il file e quindi penso che non abbia senso produrre un token ERROR. Inoltre riga e colonna a quale valore andrebbero inizializzate? Idem per lo state. Grazie

-- DeliaPassalacqua - 06 Apr 2007

Re: Get_next_token: errori diversi da ERR_INVALID_TOKEN

Fate la cosa che vi sembra più logica.

-- RobertoNavigli - 07 Apr 2007

token errato EQUAL-NAME

Quali token devo emettere in questa situazione:
<DOC =id = "3">
-- GabrieleIoannucci - 06 Apr 2007

Re: token errato EQUAL-NAME

Devo emettere due token diversi per = e per id: EQUAL e poi NAME. L'analizzatore lessicale non ha cognizione della corretta sintassi con cui i token vanno specificati.

-- RobertoNavigli - 08 Apr 2007

get_next_token

Scusi prof un chiarimento...ma quando dal main si chiama la get_next_token è già nel main che si sono settati i valori di la->riga e la->colonna e quindi la mia xsml_lex.c deve andare in pla->file in quella posizione passata come parametro.Ho capito bene? Grazie.

-- GianfrancoFonzini - 07 Apr 2007

Re: get_next_token

Il main fa quello che si vede dal codice che abbiamo messo online. Tutte le altre modifiche alle strutture devono essere fatte dalle tre funzioni che dovete implementare o da eventuali funzioni chiamate da queste.

-- RobertoNavigli - 08 Apr 2007

Buffer

la dichiarazione di un eventuale buffer (ad esempio un array) si puo mettere all'inizio del modulo: esterna e visibile a tutte e 3 le funzioni o deve necessariamente essere locale e cioè dichiarata in una delle funzioni del modulo dal momento che le uniche dichiarazioni globali stanno nel .h?

-- VincenzoNovino - 08 Apr 2007

STRINGHE

Quando sto in content, se ho l'esempio mostrato, cioè che il testo va accapo le devo vedere come 2 string, una sulla prima riga e una sulla seconda, o una stringa unica?
<doc> ciao
paperino </doc>
-- DanieleR - 10 Apr 2007

Re: STRINGHE

Una stringa unica. '\t' e '\n' non sono altro che caratteri.

-- RobertoNavigli - 11 Apr 2007

NAME

Salve, se io incontro una situazione del tipo devo emettere errore perchè id> non è un nome valido di attributo oppure spezzo in due token NAME "id" e CLOSE_TAG ">"?

-- LauraMinicucci - 10 Apr 2007

NAME2

non ho allegato il codice. Il codice di cui chiedevo è il seguente
<utente id>
-- LauraMinicucci - 10 Apr 2007

Re: NAME2

Ho gia' risposto a questa domanda. Leggete sopra.

-- RobertoNavigli - 11 Apr 2007

OPEN_END_TAG

Ho due dubbi per quanto riguarda il token OPEN_END_TAG. In una situazione del genere: -Devo dare errore perchè in un end tag ci può essere solo il nome del tag da chiudere? -Nell'analizzare il nome e l'attributo, li tratto esattamente come se stessi in un normale tag di apertutra e quindi anche il campo state (dell'analizzatore) deve stare su LEX_STATE_TAG?
</doc ciao="mare">
-- FedericoScacco - 11 Apr 2007

Re: OPEN_END_TAG

No, non darei errore, visto che sto comunque all'interno di un tag. Ci penserà l'analizzatore sintattico (modulo 3).

-- RobertoNavigli - 11 Apr 2007

(senza titolo)

Ho un dubbio. In un token di tipo STRING (valore di un attirbuto) se incontro una situazione come quella seguente devo emettere errore perchè non ho chiuso il token correttamente con i doppi apici oppure salvo il token STRING ed il token CLOSE_TAG senza emettere alcun errore lessicale?
<documento id="carta>
Salverò:
STRING "carta"
CLOSE_TAG  ">"
Oppure:
ERROR "carta>"

-- LauraMinicucci - 11 Apr 2007

STRING

Ho un dubbio. In un token di tipo STRING (valore di un attirbuto) se incontro una situazione come quella seguente devo emettere errore perchè non ho chiuso il token correttamente con i doppi apici oppure salvo il token STRING ed il token CLOSE_TAG senza emettere alcun errore lessicale?
<documento id="carta>
Salverò:
STRING "carta"
CLOSE_TAG  ">"
Oppure:
ERROR "carta>"

-- LauraMinicucci - 11 Apr 2007

DUBBI

Allora avrei dei dubbi, andiamo per ordine: 1) per quanto riguarda i token NAME id e STRING 11 essi possono essere emessi come tali o in questo caso la cosa giusta è emmettere un token ERROR relativo ad un NAME errato con testo id"? 2) analogamente a sopra possono essere emessi due token esatti, o un token STRING 11 e poi un token ERROR i perché non vi è lo spazio prima? 3) e 4) dopo aver emesso corretamente i token OPEN_START_TAG utente NAME id EQUAL e STRING 11 deve essere emesso un token ERROR > perché non vi è uno spazio prima o può essere emesso un token CLOSE_TAG?
1) <utente id"11" 
2) <utente "11"id 
3) <utente id="11">
4) <utente "11"=id>
-- GiuseppeSantaMariaSosso - 11 Apr 2007

Re: Re: Chiarimento su dubbio
Quindi se il codice 1) genera un errore quali sono i caratteri legali che posso avere dopo una STRING delimitata da ""? I codici 2) e 3) sono legali o devo per forza controllare che dopo la chiusura delle virgolette ci sia uno spazio o al massimo il carattere CLOSE_TAG?
1) <documento id="1"provola"provoletta">
2) <documento id="1"< 
3) <documento id="1"=
-- LauraMinicucci - 11 Apr 2007

ANCORA DUBBI

All'interno di un tag una situazione come la 1) è legale e quindi si possono emettere due token STRING o una volta emesso il primo token STRING si emetterà un token ERROR per la mancanza di almeno uno spazio? Analogamente nella 2) possono essere emessi due token EQUAL o dopo il primo EQUAL un token ERROR sempre per la mancanza di spazi? Grazie per le risposte.
1) "id 1""id 2"
2) ==
-- GiuseppeSantaMariaSosso - 12 Apr 2007

file xsml

Forse é giá stato detto o scritto...o nn dovrei neanke chiederlo... ma il file xsml lo consideriamo binario o di testo? forse la seconda...

-- CleoniceMansillo - 12 Apr 2007

errore nei token STRING dentro i TAG

JacopoSciarra - 13 Apr 2007

errore nei token STRING nei TAG

JacopoSciarra - 13 Apr 2007

Segmentation fault e Creazione eseguibile

Nel testare il mio programma mi sono accorto che qualunque file in xsml gli venga passato, mi da sempre segmentation fault. Volevo sapere se c'era un motivo noto o ricorrente che causa ciò. Colgo anche l'occasione per chiedere se il modo che uso per creare l'eseguibile è corretto:

gcc -c xsml_lex.c gcc -c main.c gcc main.o xsml_lex.o e lancio poi l'eseguibile come a.out

Grazie per l'attenzione.


-- FedericoScacco - 13 Apr 2007

Segmentation fault e Creazione eseguibile bis

Scusate ma gli 'a capo' che avrebbero reso il testo più leggibile non sono venuti, ci riprovo.
gcc -c xsml_lex.c
gcc -c main.c
gcc main.o xsml.o
./a.out + nome del file da testare
-- FedericoScacco - 13 Apr 2007

Re: Segmentation fault e Creazione eseguibile

Federico,

sembra un problema di puntatori. Il segmentation fault si ottiene in genere quando accedo a un puntatore che punta a una zona di memoria non allocata o comunque spuria. In altre parole il puntatore contiene un indirizzo non voluto e quindi il programma "impazzisce".


-- RobertoNavigli - 13 Apr 2007

Chiarimenti sui vari casi d'errore

Ragazzi, e' chiaro che non posso rispondere sui singoli casi: le combinazioni di caratteri sono le piu' varie. Noi proveremo il vostro programma su casi di errore abbastanza standard, non andremo a cercare il pelo nell'uovo con sequenze troppo strane.

Come regola generale, comunque, tenete conto che - nel caso di un carattere non voluto (es. "ciao<) - dovete emettere il testo del token fino al carattere che genera l'errore (in questo caso, ciao<). Vedete anche i file test4.xsml e test5.xsml nella pagina del modulo 1.


-- RobertoNavigli - 13 Apr 2007

Sequenza di token

chiedendo informazioni, alcuni mi hanno detto che con:

<abc=

l'analizzatore lessicale restituisce due token:

START TAG abc EQUAL

mentre altri sostengono che restituisca un token errore

ERROR <abc=

in quanto abc= non è un nome valido data la presenza del carattere '='

stessa cosa per:

<abc<abc

è uno START TAG da un nome invalido?oppure due START TAG validi?

vorrei che fosse chiarito una volta per tutte....


-- VincenzoNovino - 13 Apr 2007

Re: Sequenza di token

Io preferisco la situazione in cui viene segnalato un invalid token appena si trova <, però non credo che ci metteremo a questionare per situazioni così critiche (ma in altre situazioni, dove il comportamento è chiaro, dovete restituire tutti lo stesso output: per esempio su <ciao? dovete riconoscere un errore ERR_INVALID_TOKEN con testo ciao?).

Questo indicato da Vincenzo è uno di quei casi limite in cui, alla fine, vanno bene entrambe le soluzioni (tanto sarà l'analizzatore sintattico a stroncare eventuali entusiasmi dell'analizzatore lessicale :-)). Non vi preoccupate troppo di quale sia il caso giusto per noi, ma fate che il vostro comportamento sia ragionevole.


-- RobertoNavigli - 13 Apr 2007

"test1.xsml" [manca carattere di fine linea][DOS] 14L, 310C

Ho fatto mille ricerche per capire se il problema è il mio sorgente che non è portabile da un sistema all'altro o se effettivamente il fatto che manchi il carattere di fine linea non mi permette di individuare l'EOF. Senza il suddetto carattere l'output della linea 14 del programma è il seguente, dopodichè la bash va riavviata perchè non scrive più un carattere corretto. Perfavore aiutatemi, nessuno ha lo stesso problema?
14,8    ERROR   "&#65533;&#65533;[]Ð&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;U&#65533;&#65533;S&#65533;&#65533;&#65533;E&#65533;E&#65533;&#65533;D$
                                             &#65533;E&#65533;&#65533;      &#65533;&#65533;&#65533;&#65533;k&#65533;"
±&#9226;&#9500;_&#9532;&#9226;&#9474;&#9500;_&#9500;&#9146;&#9488;&#9226;&#9532;() ERROR_CODE = 4
&#9229;&#9226;&#9484;&#9227;&#9618;@&#9484;&#9226;&#9146;&#9532;&#9618;&#9148;&#9229;&#9146;:·/D&#9226;&#9149;&#9488;&#9500;&#9146;&#9147;/&#9484;&#9618;&#9225;&#9147;&#9148;&#9146;±2/&#9484;&#9618;&#9225;13$
-- DeliaPassalacqua - 13 Apr 2007

Re: "test1.xsml" [manca carattere di fine linea][DOS] 14L, 310C

Chiedo scusa per l'allarmismo... il problema sembra essere stato un banalissimo errore di inizializzazione. smile Grazie comunque.

-- DeliaPassalacqua - 13 Apr 2007

Comando diff e modifica main

Salve, per poter confrontare il nostro output con quello che ci avete fornito occorre effettuare una modifica al main, poichè il nostro main restituisce un output diverso. Inoltre nel caso di EOF, EQUAL e CLOSE_TAG è necessario inizializzare il campo ptk->text a "" e non a NULL (in una precedente risposta avevate detto che era indifferente). Potreste fornirci un main ufficiale che restituisce lo stesso output dei test? Grazie.
53  if (tok.type == CLOSE_TAG || tok.type == EQUAL)

54         printf("%d,%d\t%s\t\"%s\"\n",

55                             tok.riga, tok.colonna, token_type_to_string(tok.type), tok.text);
-- DeliaPassalacqua - 14 Apr 2007

Re: Comando diff e modifica main

Ho aggiornato i file, controllate.

-- RobertoNavigli - 15 Apr 2007

Stato di pla->state quando invoco la funzione new_lexical_analyzer

Quando il main invoca la funzione new_lexical_analyzer, quale deve essere lo stato di pla? Mi spiego meglio, dato che mi trovo per la prima volta ad analizzare il file .xsml dovrò impostare pla->riga e pla->colonna ad 1, immagino. Come devo impostare, invece, pla->state?

-- PaoloPoli - 14 Apr 2007

Re: Stato di pla->state quando invoco la funzione new_lexical_analyzer

ciao da quanto è stato detto a lezione lo devi impostare su LEX_STATE_CONTENT

-- LauraMinicucci - 14 Apr 2007

Segmentation fault e Creazione eseguibile

Salve a tutti!

Ho riscontrato lo stesso errore citato da Federico Scacco (e guarda caso anche io mi chiamo Federico smile ).

Ho notato in oltre che l'errore avviene non appena il programma esegue il primo accesso alla struttura. Ho notato anche che compilando per 64bit il programma gira. Provando a compilare per 32bit con "gcc -m32" il programma va in "Segmentation Fault".

Da quello che ho capito il proprema potrebbe dipendere dall'allocazione delle struct. Queste infatti, nel main.c fornito dal Prof. sono allocate come variabili struct e non come puntatori. La memoria allocata quindi non è "pulita", e così quando il programma tenta per la prima volta di accedere crasha.

Ho modificato l'allocazione delle struct (ho postato il codice) e modificato gli accessi alle strutture nel main.c, ad esempio da "tok.riga" a "tok->riga".

Risultato il programma non crasha piu. Questo è merito della "calloc" che infatti azzera la memorioa oltre ad allocarla. Sarebbe forse utili chiedere al Prof. di modificare il main, o di trovare comunque una soluzione all'errore.

Buon Lavoro!

/*Le vecchie varaibile struct le ho cambiate con:*/

lex_an *la = NULL;
token *tok = NULL;
   
la = calloc(1 , sizeof(lex_an));
tok = calloc(1 , sizeof(token));

-- PezzRico - 14 Apr 2007

Segmentation fault e Creazione eseguibile

Scusate il doppione ho dimenticato di dire di modificare anche le occorrenze di "&la" e "&tok" con "la" e "tok" altrimenti il programma continua a crashare (di fatti si aspetta un puntatore e quello dobbiamo passargli).

Buon Lavoro!

/*Ad esempio la chiamata di get_next_token diventa :*/

error_code = get_next_token(la, tok);
-- PezzRico - 14 Apr 2007

Re: Segmentation fault e Creazione eseguibile

ATTENZIONE: non potete modificare il main!!!! Dovete consegnare solo il file xsml_lex.c!!! Il main passa una struct e non un puntatore perché la struct preesiste alla funzione (viene creata dentro il main), quindi bisogna solo riempirla all'interno delle 3 funzioni da implementare.

-- RobertoNavigli - 15 Apr 2007

Test 3 e test 6

salve a tutti. In entrambe i test c'è una stringa finale dopo l'ultimo close tag; sulle specifiche c'era scritto che nel caso di una stringa fuori dal tag terminata da un EOF invece che da un open tag era da considerarsi errore, mentre nei risultati dei test forniti viene presa tutta la stringa normalmente fino a EOF e poi riportato l'errore di fine file. Cosa bisogna fare? riporto la parte di codice interessata presa dal test3.xsml
</ma-quale-radice>
fredEOF
-- ElenaAgostini - 14 Apr 2007

Re: Test 3 e test 6

Riguardo le specifiche: può citare il frammento in questione? Non riesco a trovarlo. Nelle specifiche si parla solo di stringhe racchiuse da virgolette, non di stringhe nello stato LEX_STATE_CONTENT.

Riguardo test 3 test 6 ho aggiornato i file, controllate.


-- RobertoNavigli - 15 Apr 2007

CHIARIMENTI

Professore quindi anche i casi da me segnalati nei due messaggi precedenti e che riporto di seguito per chiarezza sono da considerarsi casi limite, in cui ogni nostra scelta sensata va bene, o si devono seguire dei comportamenti specifici tra quelli da me elencati?
1) id"11"   //2 token esatti NAME e STRING o un token ERROR id"?
2) "11"id   //2 token esatti STRING e NAME o un token STRING e uno ERROR per la mancanza dello spazio?
3) "id 1""id 2"  //2 token STRING o un token STRING e uno ERROR " per la mancanza dello spazio?
4) ==  //2 token EQUAL o un token EQUAL e uno ERROR = per la mancanza dello spazio?

-- GiuseppeSantaMariaSosso - 15 Apr 2007

Re: CHIARIMENTI

Mi sembrano casi complicati (tranne forse l'ultimo), comunque io procederei così:

1) per me è un token ERROR id" 2) ERROR per mancanza di spazio 3) ERROR per mancanza di spazio 4) = sono due token EQUAL  (non e' richiesto lo spazio dopo l').


-- RobertoNavigli - 15 Apr 2007

stringa="xxx>

-- JacopoSciarra - 15 Apr 2007

Re:string="xxx>

Se avete dubbi, seguite l'output che ho fornito.

-- RobertoNavigli - 15 Apr 2007

esempio6

nel vostro file di prova dice che ci sono 34 righe invece di 36 quindi è un vostro errore?????
<html>
<body>

<h4>This table has no borders:</h4>
<table cellpadding='0' cellspacing='1'>
<tr>
  <td>100</td>
  <td>200</td>
  <td>300</td>
</tr>

<tr>
  <td>400</td>
  <td>500</td>
  <td>600</td>
</tr>
</table>

<h4>And this table has no borders:</h4>
<table border="0">
<tr>

  <td>100</td>
  <td>200</td>
  <td>300</td>
</tr>
<tr>
  <td>400</td>
  <td>500</td>

  <td>600</td>
</tr>
</table>

</body>
</html>
-- AlessandroMastropietro - 15 Apr 2007

Re: esempio6

Ho aggiornato i file, controllate.

-- RobertoNavigli - 15 Apr 2007

diff

Salve ho questo tipo di problema. Ho testato il mio programma con i vari file test.xsml che sono stati messi on line. Ora il mio output sembra essere uguale a quello dei file test.out però se provo a chiamare il comando diff test.out mio_output.out mi da un output come quello seguente(quello che segue è relativo alle differenze tra il mio output su test4.xsml e quello di test4.out). Non riesco a capire quale sia il problema....
laura@laminicucci:~/Desktop/Modulo1> diff test4.out miotest4.out
1,4c1,4
< 1,1   STRING  "   "
< 1,4   OPEN_END_TAG    "tag-chiuso"
< 1,16  CLOSE_TAG
< 1,17  STRING  " il prossimo tag aperto non e' ammesso!!!
---
> 1,1     STRING  "   "
> 1,4     OPEN_END_TAG    "tag-chiuso"
> 1,16    CLOSE_TAG
> 1,17    STRING  " il prossimo tag aperto non e' ammesso!!!
6c6
< 2,1   ERROR   "?"
---
> 2,1     ERROR   "?"
-- LauraMinicucci - 15 Apr 2007

Re: diff

A prima vista il problema sembra dipendere dal numero di spazi (o tab) tra la coppia (riga,colonna) e il codice d'errore. Essendo questo un problema del main, sembrerebbe dipendere da una sua eventuale modifica al main stesso (da evitare). Verifichi che i due file output abbiano esattamente gli stessi caratteri tra, ad es., 1,1 e STRING.

-- RobertoNavigli - 15 Apr 2007

Re: Re: Segmentation fault e Creazione eseguibile
So bene che non devo modificare il main. Tuttavia l'ho fatto per verificare che l'errore fosse dovuto dall'allocazione delle struct, e come ho postato sopra il progrmma non crasha se vengono passate le struct in quel modo.

Visto che non sono l'unico ad aver riscontrato il problema, sarebbe meglio modificare il main ? Oppure perchè non ci fornite la versione del gcc e il comando di compilazione con cui testate i nostri file ? Cosa ci garantisce che il progetto sia funzionante sulle nostre macchine e non sulle vostre ?

Grazie Buon Lavoro


-- PezzRico - 15 Apr 2007

Re: Re: Re: Segmentation Fault e creazione eseguibile

Ciao. E' vero anche io sto provando in tutti i modi ma anche se nella get_next_token metto solo una printf("ciao") nemmeno la stampa, mi da segmentation fault (core dumped). So per certo che la funzione di new_lex_an è fatta bene, in quanto l'ho provata insieme a close_lex_an commentando il ciclo di lettura dei token nella main. Per esclusione il problema è o del main o della mia funzione, però perchè non parte nemmeno con una printf o comunque non si blocca solo nella parte che io avrei sbagliato del codice? io compilo con
gcc -o modulo1 xsml_lex.c main.c
-- MirkoSquitieri - 16 Apr 2007

Segmentation Fault e creazione eseguibile -2

Inoltre non stiamo parlando di parti di programma dove magari abbiamo sbagliato noi delle allocazioni (come quando dobbiamo allocare spazio per un eventuale testo), il programma nn parte nemmeno!

-- MirkoSquitieri - 16 Apr 2007

Re: Segmentation Fault e creazione eseguibile -2

Ragazzi, non so che cosa facciate dentro la funzione get_next_token, ma è certamente vostro il problema. Non è né del main, né del compilatore. Ripeto: non dovete allocare le strutture di tipo token, poiché l'indirizzo di queste viene passato direttamente dal main. Dovete fare debugging fino ad arrivare a isolare il segmentation fault.

Potete tranquillamente compilare su Windows, provare su Windows, ecc. ecc., però vi consiglio di fare un salto in laboratorio a via salaria e provare a compilare anche con il gcc (oppure potete compilare con il DJGPP che è un porting praticamente equivalente del gcc).


-- RobertoNavigli - 16 Apr 2007

Testare con Windows

Scusi ma chi non ha linux come fà a testare il propio programma???Avendo solo a disposizione Windows!!!!!!!!

-- AlessandroMastropietro - 15 Apr 2007

Testare con Windows

Premesso che Linux è gratuito e può essere installato da chiunque. Comunque potete installare DJCPP per Windows e testarlo con il gcc fornito dal pacchetto. Oppure andate in laboratorio a via salaria 113 e compilate da lì. Sono tre diverse possibilità!!!

-- RobertoNavigli - 15 Apr 2007

<tit?olo

in questo caso va bene mettere nel campo text la stringa intera "tit?olo"?? Se invece bisogna prendere solo fino al carattere che genera l'errore (cioè '?'), a quel punto di "olo" che ne facciamo?? Un NAME? mi scusa se se ne era già parlato ma non mi sembra.
<tit?olo
-- MarcoMarinangeli - 15 Apr 2007

Re: <tit?olo

Le specifiche dicono chiaramente come comportarsi...


-- RobertoNavigli - 16 Apr 2007

output, è la stessa cosa? (pignoleria)

sui vostri file di output alla fine quando il main trova l'errore di EOF, nel campo text non stampa nulla. Io in questi casi ho messo il campo text del token a NULL. E nell'output tra le virgolette mi stampa NULL. E' uguale, giusto?

Altra differenza nel vostro test2.out quando c'è un token che non ha testo, stampate due virgolette e basta. Il mio output in quel caso non stampa nulla. Non bisogna preoccuparsi di cio immagino..me lo potete confermare? grazie


-- JacopoSciarra - 16 Apr 2007

output, è la stessa cosa? (pignoleria)

Stringa vuota o NULL va bene lo stesso.


-- RobertoNavigli - 16 Apr 2007

ALTRI FILE DI TEST

metterete altri file di test on-line?

-- GianlucaSquarcia - 16 Apr 2007

Re: ALTRI FILE DI TEST

Non vi bastano?!

-- RobertoNavigli - 16 Apr 2007

il campo text in un errore

è gia stato trattato l'argomento ma ho notato molta confusione e non ho anocora ben capito. quando c'è un errore, un carattere non valido, in un token ad es. di tipo open_start_tag, la parte restante del token va considerata come un altro token (che sarà di tipo name) o va ignorata?
<docu(mento

è un solo token di tipo ERROR
o sono due (uno ERROR e uno NAME mento) ??
-- JacopoSciarra - 17 Apr 2007

Re: campo text in un errore

il mio programma quando c'è un errore nel campo text del token mette la stringa vuota, invece di riportare la stringa fino a dove c'è stato l'errore. è un errore grave?

-- JacopoSciarra - 17 Apr 2007

Re: Re: (senza titolo)
mi correggo: non la stringa vuota ma NULL

-- JacopoSciarra - 17 Apr 2007

Re: Re: Re: campo text in un errore
ho corretto il problema e ora il mio prog mette la stringa FINO AL CARATTERE CHE HA GENERATO l'errore. e' giusto che il carattere non valido sia nella stringa?
<docu&mento

ERROR docu&

oppure

ERROR docu

??
-- JacopoSciarra - 17 Apr 2007

Re: Re: Re: il campo text in un errore
Il carattere che genera l'errore deve essere nella stringa.

-- RobertoNavigli - 17 Apr 2007

Re: Re: Re: il campo text in un errore
e questo è chiaro.. ma la parte rimanente ?? in questo caso "mento"?
<docu&mento
-- MarcoMarinangeli - 17 Apr 2007

Errore mancanza spazio

Professore, ha detto che lei negli output seguenti restituirebbe due token ERROR, perchè? L'analizzatore lessicale riconosce la stringa in quanto racchiusa tra apici, ma non sa cosa verrà dopo. Perchè dovrebbe restituire errore?

2) "11"id   //2 token esatti STRING e NAME o un token STRING e uno ERROR per la mancanza dello spazio?
3) "id 1""id 2"  //2 token STRING o un token STRING e uno ERROR " per la mancanza dello spazio?

1)
1,8     STRING  "11"
1,12    NAME    "id"

2)
1,8     STRING  "id 1"
1,14    STRING  "id 2"




-- DeliaPassalacqua - 17 Apr 2007

Re: Errore mancanza spazio

E' un ginepraio. Non va bene perché non c'è uno spazio tra i due token (e i token dentro un tag devono essere sempre separati da spazio o altri caratteri separatori come l'a capo). Non vi preoccupate, questi sono casi limite, non testeremo rispetto a questi casi. Però i casi che sono resi espliciti nelle specifiche devono essere previsti (es. i caratteri validi nel nome di un tag).

-- DeliaPassalacqua - 17 Apr 2007


ERR_INPUT uguale a ERR_EOF?

Nelle specifiche è scritto: "ERR_INPUT Nel caso si verifichi un qualsiasi errore nella lettura dallo stream dell’analizzatore lessicale." Ma la fgetc restituisce EOF per qualsiasi errore di lettura. Come mi devo comportare?


-- DeliaPassalacqua - 17 Apr 2007

Re: ERR_INPUT uguale a ERR_EOF?

Bisognerebbe utilizzare ferror per conoscere esattamente il tipo di errore restituito da fgetc. Potete tralasciare questo aspetto.

-- RobertoNavigli - 17 Apr 2007

Re: Re: Re: Re: il campo text in un errore

Si ferma al carattere & (che viene incluso nel campo text) emettendo ERROR. Non si va avanti.

-- RobertoNavigli - 17 Apr 2007

MODIFICA SU MODULO CONSEGNATO

ho consegnato il mio modulo, adesso però, dato che ho fatto delle modifiche, volevo sapere se posso spedire anche questo oppure ormai considerate solo il primo gia inviato. ciao e grazie

-- GianlucaSquarcia - 17 Apr 2007

MODIFICA SU MODULO CONSEGNATO risolto

scusate....non avevo letto che c'era scritto nella pagina di consegna.

-- GianlucaSquarcia - 17 Apr 2007

ERR_INPUT

Salve,io ho utilizzato fgetc per la scansione del file,la quale mi restituisce EOF nel caso di errore di lettura.In realtà questa sarebbe una situazione da segnalare come ERR_INPUT,ma come la distinguo dal caso in cui trovassi l'EOF prima di aver completato la lettura del token o dalla fine del file stesso,casi in cui dovrei emettere ERR_EOF??

-- AntonioMiranda - 18 Apr 2007

Re: ERR_INPUT

Scusate non avevo fatto attenzione al fatto che questa domanda era già stata fatta..ne ho un'altra però:dopo l'OPEN_CLOSE_TAG ci possono essere spazi o new line prima del CLOSE_TAG?

-- AntonioMiranda - 18 Apr 2007

Re: ERR_INPUT
Sì, non ci vedo nulla di male.

-- RobertoNavigli - 18 Apr 2007

Dubbio stringa interna al tag seguita da EOF

nelle specifiche c'e scritto: ....(ad esempio, dopo aver letto i doppi apici si comincia a leggere una stringa ma si arriva all’EOF prima di trovare i doppi apici di chiusura). In questi casi, oltre al token di tipo ERROR con le informazioni sul pezzo di token letto prima dell’EOF, l’analizzatore dovrà restituire il codice di errore ERR_EOF.

Quindi il carattere di EOF non va nel campo text del token, ci va solo la stringa fino all'EOF escluso. Ho capito bene?


-- GianlucaSquarcia - 18 Apr 2007

Re: Dubbio stringa interna al tag seguita da EOF

Esatto. Peraltro EOF non è un vero carattere.

-- RobertoNavigli - 18 Apr 2007

Dubbio stringa interna al tag seguita da EOF

ok...quindi se ho la seguente situazione il campo text della stringa interna lo inizializzo a NULL?

<tag id = "
-- GianlucaSquarcia - 18 Apr 2007

CARATTERE '\n' e TIPO DI TOKEN 'ERROR'

Salve,dalle specifiche nn mi è chiaro se quando la scansione incontra un carattere di newline deve essere considerato come un token string a parte o facente parte della stringa in cui è incluso, perchè è detto che deve essere considerato tutto un token,ma poi nell'esempio viene considerato separatamente..inoltre ho letto che nel caso di ERR_EOF o ERR_INVALID_TOKEN si deve settare il token a ERROR,ma nel file .h non c'è un tipo di token ERROR,come mai?

-- AntonioMiranda - 18 Apr 2007

contenuto

Se mi trovo in LEX_STATE_CONTENT, è chiaro che faranno parte dello stesso token di tipo STRING tutti i caratteri che leggo fino a EOF o un carattere <, per il quale dovrò cambiare il mio stato. Ma se leggo >, posso nn considerarlo come un CLOSE_TAG visto che sono nello stato content e nn è possibile che quel > chiuda un tag?
abcdefghi>lmnoEOF
corrisponde a
STRING  "abcdefghi>lmno"
ERROR   ""
-- CleoniceMansillo - 18 Apr 2007

Re: CARATTERE '\n' e TIPO DI TOKEN 'ERROR'

Guarda che c'è il tipo ERROR!!
typedef enum
{ 
   ERROR,
   OPEN_START_TAG,
   OPEN_END_TAG,
   CLOSE_TAG,
   EQUAL,
   NAME,
   STRING
} token_type;
-- CleoniceMansillo - 18 Apr 2007

Modalità di consegna

vorrei sapere se nel file che consegnamo va inserito magari come commento il nostro nome e cognome, il numero di matricola, la versione di linux e del compilatore usati, etc.

-- LucaDiFilippo - 18 Apr 2007

Test3.xsml

una domanda sull'output di questo file di test, come mai deve terminare con un errore?cosa c'è che non va nel file?

-- LucaDiFilippo - 18 Apr 2007

Re: CARATTERE '\n' e TIPO DI TOKEN 'ERROR'

Mi sa che hai l'header vecchio, è stato cambiato tempo fa.

-- DeliaPassalacqua - 18 Apr 2007

Re: Re: Errore mancanza spazio
Ma allora secondo questo concetto anche l'esempio seguente è errore? Se l'analizzatore lessicale non deve considerare la corretta sequenza dei token, cosa importa cosa viene dopo un token string? Il token string è delimitato dalle virgolette e ciò lo rende corretto.
<pippo "id"=>
-- DeliaPassalacqua - 18 Apr 2007

Re: Re: Re: Errore mancanza spazio

Quello va bene. Non entrate in paranoia: non saremo rigidi nella correzione. L'importante è che il programma funzioni dando un output ragionevole e rispetti le specifiche.

-- RobertoNavigli - 19 Apr 2007

Re: Modalità di consegna

Seguite quello che c'è scritto sul modulo di consegna.

-- RobertoNavigli - 19 Apr 2007

Re: Re: CLOSE TAG
professore precedentemente ha detto che l'esempio qui sotto doveva dare tutti token validi. ma non è un errore lessicale avere un '>' fuori da un tag??
<doc>>
-- MarcoMarinangeli - 20 Apr 2007

RISULTATI

2 cose...quando usciranno i risultati del primo modulo?.....metterete un voto in trentesimi oppure sarà solo una cosa del tipo compila e funziona, compila e non funziona, non compila e funziona etc etc?

-- GianlucaSquarcia - 20 Apr 2007

consegna

il file che consegnamo si deve chiamare xsml_lex.c.zip o modulo.zip?

-- GianlucaSquarcia - 20 Apr 2007

Re: RISULTATI

Il prima possibile, ma comunque ci vorrà un po' di tempo. Non metteremo un voto in trentesimi, ma un giudizio. Guarderemo anche il codice.

-- RobertoNavigli - 20 Apr 2007

Re: consegna

Non importa, tanto poi viene rinominato automaticamente. L'importante è che sia zip.

-- RobertoNavigli - 20 Apr 2007

Consegna zip o tar.gz

Nella pagina di consegna c'è scritto "utilizzare solo zip o tar.gz". Quindi anche tar.gz è ok o devo riconsegnare zip?

-- DeliaPassalacqua - 20 Apr 2007

Re: Consegna zip o tar.gz

Va bene anche tar.gz.

-- RobertoNavigli - 20 Apr 2007

Problema con file di test

Utilizzando i file di test dopo averli salvati con tasto destro -> salva con nome, il mio programma si comporta in modo corretto fino al primo \n, mentre con file creati e scritti su linux non ci sono problemi..

-- AntonellaPaluzzi - 20 Apr 2007

Precisazione Attributo

Salve a tutti. Nel caso riportato come devo comportarmi?
<tag id="ciao>EOF //errore perchè trovo un close tag prima dei " (invalid token), o errore perchè trovo un EOF prima dei " (err eof)? 
-- ElenaAgostini - 20 Apr 2007

Re: Precisazione Attributo

Ciao...da quello che so (e credo di non sbagliarmi) devi restituire errore ERR_INVALID_TOKEN perchè non hai chiuso la stringa con le " big grin ciao

-- LauraMinicucci - 20 Apr 2007

ARRIVATO?

Professore senta io ho inviato il modulo e nella pagina di consegna c'è scritto che si sarebbe dovuta ricevere una e-mail di conferma ma ancora non mi è arrivato nulla...vorrei solo sapere se il modulo vi è effettivamente arrivato...grazie!

-- GiuseppeSantaMariaSosso - 20 Apr 2007

Re: ARRIVATO?

Mi scusi come non detto tutto apposto...la ringrazio comunque!

-- GiuseppeSantaMariaSosso - 20 Apr 2007

Consiglio su come fare i test in windows

con un semplice file.bat si può verificare se i risultati ottenuti sono uguali a quelli attesi e fare quindi una programmazione test driven ciao
analizzatore.exe test1.xsml > test1.mio
analizzatore.exe test2.xsml > test2.mio
analizzatore.exe test3.xsml > test3.mio
analizzatore.exe test4.xsml > test4.mio
analizzatore.exe test5.xsml > test5.mio
analizzatore.exe test6.htm > test6.mio

fc /n /l /t test1.mio test1.out
fc /n /l /t test2.mio test2.out
fc /n /l /t test3.mio test3.out
fc /n /l /t test4.mio test4.out
fc /n /l /t test5.mio test5.out
fc /n /l /t test6.mio test6.out
-- DanieleCesaroni - 20 Apr 2007

errore nell'orario di invio della soluzione

l'ora segnata dal sistema è di almeno 30 minuti avanti, il primo invio me lo ha segnato alle 00:03 il secondo (per test) alle 00:14 mentre adesso sono le 23:45.

-- PaoloFalbo - 20 Apr 2007

Re: errore nell'orario di invio della soluzione

Confermo, anche a me per il file inviato alle 23.45, la mail di conferma risulta delle ore 00.19 quando in realtà è arrivata immediatamente dopo l'invio..

-- FlavioPietrelli - 22 Apr 2007

email non arrivata

mi sta sorgendo un dubbio.. io ho consegnato il modulo il 19 aprile. la pagina seguente a quella della consegna mi ha detto che la consegna era riuscita, ma non mi è arrivata nessuna email..

com'è possibile?


-- JacopoSciarra - 23 Apr 2007

Re: errore

mi scusi, ho controllato meglio. Hotmail mi aveva infilato l'email nella cartella di posta indesiderata.

-- JacopoSciarra - 23 Apr 2007
No such template def TMPL:DEF{PROMPT:thread}
  • Se usate dei titoli comprensibili ci capiamo tutti un po' meglio
  • Ricordatevi di chiudere i tag che inserite nei post.
  • Non partite con i flame, c'è una pagina apposta per gli OffTopic.

-- RobertoNavigli - 28 Mar 2007


This topic: Labprog2 > WebHome4435dda > AnnoAcc0607 > SpecificheProgetto0607 > PaginaDomandeModulo1
Topic revision: r147 - 2007-04-23 - JacopoSciarra
 
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