J'ai écrit un interpréteur en utilisant ocamllex et ocamlyacc, le lexer et l'analyseur fonctionnent correctement mais actuellement ils n'analysent que le dernier argument .txt qu'il reçoit comme opposé à tous eux à leur tour. Par exemple, ./interpret one.txt two.txt three.txt
analyse uniquement three.txt
en opposition à l'analyse one.txt
puis two.txt
puis three.txt
, ce qui correspond à ce que je souhaite. Ainsi, par exemple les résultats parse sont les suivants:OCAML Prenant plusieurs arguments de stdin et fonctionnant dessus un par un
one.txt -> "1"
two.txt -> "2"
three.txt -> "3"
En appelant ./interpret one.txt two.txt three.txt
la sortie actuelle est: 3
mais je veux que ce soit 123
Voici ma classe principale qui traite de la stdin
et stdout
open Lexer
open Parser
open Arg
open Printf
let toParse c =
try let lexbuf = Lexing.from_channel c in
parser_main lexer_main lexbuf
with Parsing.Parse_error -> failwith "Parse failure!" ;;
let argument = ref stdin in
let prog p = argument := open_in p in
let usage = "./interpreter FILE" in
parse [] prog usage ;
let parsed = toParse !argument in
let result = eval parsed in
let _ = parsed in
flush stdout;
Merci pour votre temps
Salut Jeffrey, vous avez raison que eval produit la sortie, est-il aucun moyen de « obtenir » chaque argument de fichier à partir de la ligne de commande (par exemple .get (1) obtiendrait le premier argument de fichier), puis Je peux tous évaluer sur ce dossier, puis passer à la suivante? – user546482872
donc one.txt peut contenir l'int "1" qui est analysé comme un jeton int et ensuite eval produit la sortie pour ce jeton – user546482872
Je vais ajouter un exemple de code pour le traitement des noms de fichiers à partir de la ligne de commande. –