Newsgroup: it.comp.os.linux.development
Titolo: Flex o Bison o cosa?

Se io ho un file di input cosi' strutturato, e voglio che per ogni riga
di questo sia prodotto un output come quello presente a fianco:
GO 5               Vai avanti di 5 posizioni
SX 30 5            Ruota a sx di 30 gradi e poi avanti di 5 posizioni
GO 6               Vai avanti di 6 posizioni
DM 1 3 6           Mostra il contenuto delle locazioni 1, 3 e 6
SX 15              Ruota a sinistra di 15 gradi
cosa devo usare?
Per quel poco che ho capito, Flex dovrebbe essere sufficiente, anche se
la lunghezza di ogni comando e' variabile (nell'esempio SX accetta 1 o
2 parametri), e anche se non c'e' un accapo al termine di ogni comando
(qui l'ho messo per comodita' di lettura).

Zefram Cochrane wrote:

prova a studiarti la man page di scanf, probabilmente ti risolve il 
problema ( pur se con qualche limitazione ), ma semplificandoti moltissimo 
il lavoro rispetto a flex ...

il lavoro rispetto a flex ...
Cioe' secondo te riscrivere un parser, e gestire tutto l'I/O, e' piu'
conveniente che configurare un parser gia' esistente e previsto proprio
per essere configurato?

 2 parametri), e anche se non c'e' un accapo al termine di ogni comando
Flex e` ben piu` che sufficiente, qui puoi cavartela con l'I/O standard
C.
Ciao
 David
-- 
<d.santinoli presso mi. flashnet. it>

Zefram Cochrane wrote:

Dipende...
Se devi gestire un qualcosa delle'esempio dovrebbe andare meglio una riga 
del tipo
nparam=scanf( fp,"%s %d %d %d %d %d %d %d",cmd,&op1, &op2, &op3, &op4 ....
con la quale ti leggi una linea e ti ritrovi in 'cmd' il comando ed in  
'op1... opN' ti ritrovi gli operatori ...

nparam=scanf( fp,"%s %d %d %d %d %d %d %d",cmd,&op1, &op2, &op3, &op4 ....
I comandi hanno una lunghezza variabile, quindi poi alcuni dei parametri
sarebbero parti del comando successivo.
Grazie lo stesso dell'aiuto.

 sarebbero parti del comando successivo.
No, perche` la stringa di formattazione impone di accettare solo interi
(%d), non stringhe.
L'istruzione corretta sarebbe:
nparam = sscanf (source, "%s %d %d %d %d",cmd,&op1, &op2, &op3, ecc..);
	 ^^^^^^
in nparam leggi quanti parametri sono stati trovati; occhio che nparam
indica il numero dei parametri + 1 (il comando).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Porc i' mond che cio' sott i piedi!
V. Catozzo

Zefram Cochrane wrote:

Se sono separati da new-line "\n", il "mio" sistema funziona ancora; nparam 
ritorna il numero di parametri trovati ( su una riga ! ) 

Se sono separati da new-line "\n",
Come ho scritto all'inizio no, so che posso sembrare deficiente ma non
lo sono :)

 lo sono :)
Scusa ma proprio non vedo il problema. Con fgets leggi una riga, con
sscanf trovi il comando, gli argomenti ed il loro numero:
char buff[256];
char cmd[128];
int nparm;
int op[MAX_OP];
...
fgets(buff,255,file_in);
nparm = sscanf(buff,"%s %d %d %d %d ... %d", cmd, &op[0], &op[1], &op[2],
	&op[3]...&op[MAX_OP]);
nparm--;
if (parm <= 0)
	errore();
...
MAX_OP e` il numero massimo di parametri che possono essere passati. La
stringa di formattazione deve essere aggiustata di conseguenza, cosi`
come la lista di argomenti; con fgets leggi una riga e la piazzi nel
buffer; con sscanf formatti la riga letta; in nparm leggi il numero di
parametri letti; nell'array op trovi i parametri (da op[0] a
op[nparm-1]); in cmd trovi il comando.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"L'abilita` politica e` l'abilita` di prevedere quello che
 accadra` domani, la prossima settimana, il prossimo mese e
 l'anno prossimo. E di essere cosi` abili, piu` tardi,
 da spiegare  perche` non e` accaduto."

Zefram Cochrane wrote:

Sorry avete ragione, direttamente con scanf non funziona, bisogna passare 
prima x fgets ( e leggersi quindi una riga ) e po per scanf ( ovvero per 
parserizzarla ).
 

sscanf trovi il comando, gli argomenti ed il loro numero:
[...]
Cosi' dovrebbe funzionare, grazie della dritta; anche se ora lo sto
facendo con Flex, che almeno e' molto facile da modificare se cambia il
linguaggio da analizzare :)