Newsgroup: it.comp.giochi.avventure.testuali
Titolo: Consigli per scrivere un parser

Salve a tutti,
sono un programmatore dilettante con la passione per le AT.
Volevo cimentarmi nella scrittura di un'avventura (niente di complesso) e 
cercavo qualche consiglio su come programmare l'interprete dei comandi.
Il linguaggio di programmazione e' il C, ma non e' importante ai fini di 
quello che mi servirebbe:
Come dividere la frase immessa al prompt? La prima parola ok, e' il verbo... 
ma la seconda? Potrebbe essere un oggetto, un articolo o una preposizione...
E come capire l'ordine in cui vengono inseriti gli elementi? es: "Chiedi a 
Gino dov'e' la stazione" oppure "Chiedi dov'e' la stazione a Gino"?
Ci sono una serie di verbi "obbligatori" da inserire?
Grazie a tutti,
L. 


Scusa, forse ti conviene usare una cosa tipo Inform o, più semplice,
Adrift.

 ha scritto nel messaggio 
news:EACPj.20$il...@nntpserver.swip.net...

Ciao Lobo, per ottenere risultati apprezzabili devi perlomeno ottenere una 
combinazione verbo+oggetto, eliminando le parole superflue come articoli e 
preposizioni. Il Modulo Base di Colombini associa per esempio un numero a 
ogni parola, cosi' quando il parser trova una parola il cui numero 
corrisponde a quello di un articolo (99) lo elimina automaticamente.
Per frasi piu' complesse come quella che hai scritto pensa che si puo' 
sempre ridurre a 2 parole, come: Chiedi (della) stazione.
I verbi piu' comuni sono: prendi, posa, parla, chiedi, dai, mostra, sposta, 
apri, chiudi, indossa, togli, premi, alza, tira, inserisci, poi tutto 
dipende dall'avventura che hai in mente. Se con il C te la cavi forse fai 
prima a scrivere tutto un programma nuovo che a imparare Inform.
Intanto qui puoi scaricare il libro di Colombini sul Modulo Base:
http://www.erix.it/avventure.html
Spero di giocare la tua avventura, ciao!
-- 
Marco Vallarino
http://www.marcovallarino.it
http://www.truestarlife.com
http://ladolceleonora.linfatv.com
 

 Ci sono una serie di verbi "obbligatori" da inserire?
Guarda il file "grammar.h" della libreria standard di Inform, o il file 
"ItalianG.h" di Infit per avere un esempio di possibile soluzione.
In pratica e in breve vengono rimossi tutti gli articoli, e la frase 
rimanente viene confrontata con dei template, ognuno dei quali 
corrisponde ad un diverso modo di interpretare l'azione. Ad esempio:
prendi <nomedioggetto>
accendi <nomedioggetto> <preposizione-con> <nomedioggetto>
dai <nomedioggetto> <preposizione-a> <nomedioggetto>
dai <preposizione-a> <nomedioggetto> <nomedioggetto>
metti/inserisci <nomedioggetto> <preposizione-in> <nomedioggetto>
metti/inserisci <preposizione-in> <nomedioggetto> <nomedioggetto>
(con <preposizione-a> intendo la preposizione "a" o qualsiasi 
preposizione articolata derivata da "a" - idem per <preposizione-in> e 
<preposizione-con>).
Oppure potresti cercare, nella stringa di comando, soltanto le parole 
contenute nel vocabolario (solo i nomi degli oggetti). Il problema e' 
che l'interpretazione della frase potrebbe non essere univoca ("metti 
armadio cappotto" e' intuitiva per noi, ma non altrettanto per un computer).
Quella di gestire soltanto frasi "verbo+oggetto" potrebbe essere 
anch'essa una soluzione, e ti semplificherebbe la vita (almeno in 
partenza... poi potrebbe venir fuori il bisogno di gestire "metti il 
cappotto nell'armadio").
HTH
bye
-- 
Paolo Lucchesi - pluc...@NOSPAMtin.it

 prima a scrivere tutto un programma nuovo che a imparare Inform.
Secondo me, invece, proprio perche' sa gia' programmare gli conviene
usare un sistema gia' sperimentato che partire da zero (finendo poi
per fare cio' che gia' esiste).
f.

 cercavo qualche consiglio su come programmare l'interprete dei comandi.
 se il tuo fine è creare un'avventura (a meno che non preveda
mirabolanti effetti speciali o un approccio non convenzionale) il
suggerimento di usare un linguaggio dedicato è il migliore in quanto
ti avvicina la meta non di poco.
 se invece crearla da zero è parte del "divertimento" od un mezzo per
imparare a programmare o una necessità in quanto nessuno degli attuali
sistemi ti si addice... allora oltre ai suggerimenti già dati dagli
altri fai una ricerca sul newsgroup con la parola "parser" dovresti
trovare alcune lunghe discussioni piuttosto interessanti andando
indietro negli anni (2001-2002 forse, non ricordo)
furono proposti anche alcuni esempi per approcci alternativi, ne trovi
un esempio qui:
http://www.ifitalia.info/portale/modules/mydownloads/singlefile.php?cid=4&lid=51
non ricordo poi se barabino abbia mai rilasciato dei sorgenti per i
suoi giochi realizzati in visualbasic...
ciao

Ringrazio tutti per le risposte, sopratutto per i link.
In effetti mi piace proprio il "programmare"... non importa se il risultato 
finale e' uguale o inferiore a qualcosa che c'e' gia'.
Pur rischiando ingiurie e la scomunica, ammetto che non sono molto attirato 
da linguaggi troppo "dedicati", ma non voglio iniziare una discussione sui 
pregi/difetti di inform & co. aggiungo solo che per la portabilita' e per la 
gestione delle stringhe preferirei rivolgermi a linguaggi tipo Java.
Comunque mi interessava proprio il meccanismo di interpetazione dei comandi.
Vediamo se ho capito:
Gli articoli vengono eliminati, quindi "Apri il porta"  verrebbe comunque 
interpretato come "Apri la porta"?
e per i verbi che prevedono piu' oggetti comunque l'ordine e' predefinito o 
indicato dalle preposizioni?
Adesso mi studio i listati ed il libro del Grande Colombini,
Grazie ancora,
L.

 gestione delle stringhe preferirei rivolgermi a linguaggi tipo Java.
Di solito mi limito a lurkare, però, da appassionato programmatore quale 
sono, non riesco a non consigliarti Python (che per le stringhe è 
micidiale).
Esempio:
articoli = ['un', 'uno', 'una', 'il', 'lo', 'la', 'i', 'gli', 'le']
frase = "Apri la porta"
print [parole for parole in frase.split() if parole not in articoli]
Esito?
['Apri', 'porta']
E da qui in avanti. C'era anche un progettino nato da poco di Andrea 
Ferraresso che aveva l'intento di scrivere il modulo base di Colombini 
in questo linguaggio di programmazione. Potrebbe essere bello unire gli 
sforzi.
Simone

 micidiale).
E' il momento della Guerra Santa :D
... le stringhe come le tratta il perl non le tratta nessuno ....
Bwahahahahah
chomp
split
~~
iihhihi

 
Beh, per me niente guerra, ma permettetemi di farvi vedere un trucchetto
da parser per Falcon:
=================
frase = "apri la porta"
object mondo
   oggetti = [=>]  // dizionario vuoto
end
object porta
    init
        // registriamoci nel mondo.
        mondo.oggetti[ "porta" ] = self
    end
    function apri()
        > "No, ora non puoi aprirmi"
    end
end
articoli = ['un', 'uno', 'una', 'il', 'lo', 'la', 'i', 'gli', 'le']
// estrai verbo e oggetto dalla frase
verbo, oggetto = filter( lambda x => x notin articoli,
                      strSplit( frase," " ) )
// prendi l'oggetto nominato
item = mondo.oggetti[ oggetto ]
// se puoi fare la cosa sull'oggetto...
if verbo in item
   // ...allora falla!
   (#@"item.$verbo")()
end
=====================
World model, parser e oggetti tutto in una quindicina di righe :-)
E questo è niente in confronto a quello che si può fare con i costrutti
funzionali e il message marshalling.
Gian.

 Come dividere la frase immessa al prompt? La prima parola ok, e' il verbo...
puoi dare un'occhiata al mio codice in python:
http://ferraresso.eu/pymodulobase/index.html