2009-12-04 3 views
3

J'ai écrit un lexeur et un analyseur dans Prolog. Il unifie une chaîne avec son AST. Cela fait partie d'un projet de compilateur/interprète sur lequel je travaille. Naturellement, je veux maintenant lire la chaîne d'un fichier pour l'analyser. Cependant, les prédicats I ont trouvé pour cela est lu, et il ne lit que des atomes Prolog et prédicats, comme des fichiers avecLecture d'une chaîne (à partir d'un fichier) dans Prolog

hello. 

Je suis bidouilles avec les double_quotes paramètres, mais sans succès.

Je veux être capable de lire un fichier avec quelque chose comme ça

let id = \x.x in id (S (S Z)) 

puis envoyer cette chaîne prédicats d'analyse syntaxique.

Répondre

8

Vous pouvez utiliser read_line_to_codes/2 ou read_line_to_codes/3. Un exemple de programme qui lit des lignes individuelles de stdin et les imprime à stdout est la suivante:

read_lines([H|T]) :- 
    read_line_to_codes(user_input, H), H \= end_of_file, read_lines(T). 
read_lines([]). 

write_lines([]). 
write_lines([H|T]) :- 
    writef("%s\n", [H]), write_lines(T). 

main :- 
    read_lines(X), write_lines(X). 

(Il utilise writef/2 pour l'impression.) Il y a aussi read_stream_to_codes/2 et read_stream_to_codes/3, qui ne sont pas concernés par des lignes. Les impressions de code suivant toutes les entrées de stdin en une seule fois à stdout:

main :- 
    read_stream_to_codes(user_input, X), writef("%s", [X]). 

Bien sûr, il est également possible de lire à partir d'un fichier au lieu de stdin. Pour plus d'informations, voir la bibliothèque readutil.

+0

Merci :) C'était exactement ce que je cherchais! – danr

Questions connexes