J'expérimente l'écriture d'un compilateur de jouets en ocaml. Actuellement, j'essaye d'implémenter le offside rule pour mon lexer. Cependant, j'ai quelques problèmes avec la syntaxe ocaml (les erreurs du compilateur sont extrêmement informatives). Le code ci-dessous (33 lignes) provoque une erreur sur la ligne 34, au-delà de la fin du code source. Je ne suis pas sûr de ce qui cause cette erreur.Erreur de syntaxe au-delà de la fin du programme
open Printf
let s = (Stack.create():int Stack.t);
let rec check x =
(
if Stack.is_empty s then
Stack.push x s
else if Stack.top s < x then
(
Stack.push x s;
printf "INDENT\n";
)
else if Stack.top s > x then
(
printf "DEDENT\n";
Stack.pop s;
check x;
)
else
printf "MATCHED\n";
);
let main() =
(
check 0;
check 4;
check 6;
check 8;
check 5;
);
let _ = Printexc.print main()
sortie Ocaml:
File "lexer.ml", line 34, characters 0-0:
Error: Syntax error
quelqu'un peut me aider travailler à ce que l'erreur est causée par et me aider sur le chemin de la fixer?
Merci pour cela, et aussi pour éclaircir pour moi où je/ne devrais pas utiliser la seule demi -côlon. –
Bien que dans ce cas particulier, tous ces doubles-points-virgules sont facultatifs, puisque votre fichier est constitué de toutes les définitions. Seulement quand vous avez une simple déclaration au plus haut niveau, êtes-vous obligé d'avoir un double-point-virgule avant le – newacct
J'aime quand même utiliser les doubles-semis pour les exemples noob car sinon cela peut être déroutant. Les règles point-virgule d'OCaml sont facilement la partie la plus confuse du langage IMO, suivi par les opérateurs slashdot. – Chuck