2012-12-19 14 views
6

Come analizzare l'input standard (senza buffering)? Se ho capito bene, phrase/2 ha bisogno di un elenco e phrase_from_file/2 da library(pure_input) ha bisogno di un file.Analisi dall'input standard

ho risolto il problema usando predicati normali (non DCG) e l'utilizzo di built-in come get_char/2 e read_line_to_codes/2, ma alla fine l'attuazione sembra sospettosamente simile alla soluzione avrei scritto in C.

E se Posso introdurre una domanda molto correlata: che cos'è lo standard input in SWI-Prolog? read_line_to_codes (library(readutil)) richiede un flusso di input (a differenza di get/1, ad esempio). Ho capito con il seguente predicato:

input_stream(Stream) :- 
    current_stream(Object, read, Stream), 
    integer(Object). 

. . . che ovviamente funziona, ma si sente un po 'violato. È possibile avere più di un flusso di input aperto? Come faccio a sapere qual è l'input standard del sistema operativo (Linux nel mio caso)?

risposta

2

Penso che stiate cercando la corretta denominazione dei flussi. Ecco un esempio che potrebbe essere utile:

?- read_line_to_codes(user_input,L). 
|: a line 
L = [97, 32, 108, 105, 110, 101]. 

La pagina più dettagliata spiegazione che ho trovato è here.

+0

Pensavo di aver letto questa pagina abbastanza attentamente ... Questo risponde alla mia domanda di input standard. Ancora non so se posso usare DCG per analizzare l'input standard. –

+1

sì, usa un ciclo come 'repeat, read_line_to_codes (user_input, L), phrase (your_grammar, L) .' – CapelliC