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?
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...
-- 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 "��[]������U��S���E�E��D$
�E�� ����k�"
±␊├_┼␊│├_├⎺┐␊┼() ERROR_CODE = 4
␍␊┌␋▒@┌␊⎺┼▒⎼␍⎺:·/D␊⎽┐├⎺⎻/┌▒␉⎻⎼⎺±2/┌▒␉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.
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
).
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 "
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