[Kos-misc] Boulot sur du Caml
Thomas Petazzoni
thomas.petazzoni@enix.org
10 Dec 2001 19:03:32 +0100
--=-=-=
Salut,
j'ai un petit souci en Caml que je n'arrive pas a resoudre.
J'ai recopie le programme "Demonstrateur de proposition", propose dans
le bouquin "Le langage Caml", par Xavier Leroy et Pierre Weis. Je l'ai
adapte pour qu'il compile avec Ocaml, ce qui est le cas a l'heure
actuelle.
Il reste un "hic" : lorsque l'analyseur lexical a fini d'analyser le
flux de caracteres, bin il genere une exception, donc le programme
s'arrete :
(* fichier lexuniv.ml *)
let rec analyseur table flux =
Stream.from (fun count ->
match flux with parser
[< lexeme = (lire_lexeme table) >] -> Some lexeme
| [< >] -> raise Parse_failure);;
Le dernier cas du pattern matching intervient a la fin de l'analyse
du flux de caractere (comme en temoigne la session disponible plus
loin). Il faudrait renvoyer autre chose que raise
Parse_failure. J'aimerais renvoyer l'element vide du flux [< >] mais
Ocaml ne veut pas car ce n'est pas du type lexeme. Bref ca chie, et
j'aimerais bien trouver une solution... Peut etre faut analyser d'une
maniere speciale le retour chariot, declencher une exception, qui
provoquera l'analyse syntaxique de la ligne, puis son evaluation. En
fait j'en sais rien c'est pour ca que je pose la question.
Voici la session Caml montrant que le constructeur d'analyseur
lexicale marche bien :
******************* SESSION ***************************
# #load "lexuniv.cmo";;
# open Lexuniv;;
# let analyseur_de_ouf = construire_analyseur ["vrai";"faux";"(";")"];;
val analyseur_de_ouf : char Stream.t -> Lexuniv.lexeme Stream.t = <fun>
# let flux_car = Stream.of_string "vrai ( toto ) faux";;
val flux_car : char Stream.t = <abstr>
# let flux_lexeme = analyseur_de_ouf (flux_car);;
val flux_lexeme : Lexuniv.lexeme Stream.t = <abstr>
# Stream.next flux_lexeme;;
- : Lexuniv.lexeme = MC "vrai"
# Stream.next flux_lexeme;;
- : Lexuniv.lexeme = MC "("
# Stream.next flux_lexeme;;
- : Lexuniv.lexeme = Ident "toto"
# Stream.next flux_lexeme;;
- : Lexuniv.lexeme = MC ")"
# Stream.next flux_lexeme;;
- : Lexuniv.lexeme = MC "faux"
# Stream.next flux_lexeme;;
Uncaught exception: Lexuniv.Parse_failure
******************* FIN SESSION *******************
Bref, il a bien analyse tous les lexemes de la ligne, et bien vu
lesquels sont des mots cles, et lesquels ne le sont pas. Neanmoins
quand il a pu rien a se mettre sous la dent : BOUM !
Si qqun pouvait m'aider :)
Merci
thomas
PS : le code source est en fichier attache.
--=-=-=
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=proposition-0.1.tar.gz
Content-Transfer-Encoding: base64
H4sIAEH3FDwAA+0aa3PbxlFfiV9xYVUTkCUGIAmxFSUljqpM05GdjOVkOnVszhE8SJjgQeEhSxlN
fm/7L7r3Au8I8CFXZtIx1oYI3O3t62739h6zNJklWZAHSfzlzicC2x70hq4Lv7YzdG36azuDAfsV
sGMP+8O+bbuHh86O7fQOh70d5H4qgVQoshynCO3k10mEs1V4JF1R/f8KM6X/6Xs3CoOn5mE7tn3I
+7u2/w97fdr/h27P6Tl9qHcG/YGzg+ynFqQOPvP+z+9nBCmDAJ0YCD2gn1IcsJdvcXHHXl5BXeKr
qKz4PF8oRXsVnO+L9TjfRbMwuCnIeszzmyK4xSGJN+D8E04DPAkZ1SxPg/hqNDIMcueRGWvxmvhF
jtkrYJgcBehMkiS0UBhkOeADM3RL0sAPyDjHRZ6EyVVAjjTWB6eCPmtEP4s4KBsLKbJxGExSkq1q
Ck222v81/v/kPNb4f9+hMZ/7vzOEwA+VPbvf+P82IJmRGP0AHW8Y5h6i0SBDU+IHcQC/OM6QnBTQ
nmU0wWJtsDBCkqOUeIgA24KMmQ3DAAdZAi8nyC9ib84RDEf9P08LUhqQFvg4zEhpyRktipMcmbVE
Z5Y0rjnbv7Eo8jJE9OzZkrobS1p/PZGHh9VEyu6Zk1ol/XqCSi+WJOuJgYXrCek9fEspXECPdXGW
JR58S0y1C2XQD4OrmGTa6CkJl7Gd+UKEc+9aKfsQ5NeM89t3lCO8Ugj8Vb0552IZLYTya3BQGCcZ
mFMZgRKfGwg4oqMjBJMTTC/ASTBaoYBpQpt9OvCso6OSmKAw2rQ9G6d1BIQVq9OmRkQxHrXNCnZg
vxJZ66KSAva8ohKbeH+opWWP6GMBuoQNh4hEUMBoMcOzNwJKQik1MHzqbrkoQMUV5wjmIq4lhqXq
dBugV91rg0Z1LrRBszHFo0Vljy7kMrrJFZLQY0rVSA6p7WY3DawDNf8LyR1krbdPngKuyf9cZ+As
rP8HQ6fX5H/bAJb/XfCON3iCB8OARETkdi/P5ukQjz5TkUwpZedxHpCUFgZxridNP+A0I2MfB2GR
EqharCFpmqRqRA+DFEo5QRp4oiLEOSlS5IeQG7F5gkd19k3DOZpRSikLMG+PUadjd7rdzl87CGfI
Q6fv5vOhStt0bMjdNA7PqfjjxB971zAkPHSABn+xGB8+hx9rxNSmUoEcRzMWBy+ZcboR/oUg5xB1
DjoVHSNIAcrIyZXbQLcXVLd/dUCcDqavv7JXqTG8jmv0htmt5HQsZYO54AoYCJHpbGe0+Ef3rcR+
h44PkDdSzUfFNktqz5GjWGjRRIJTVkwkGxuZURDPpTHrhLGsirGy+2iSwGT9eIN90Xno7MLzZ3ie
wbMHz3N4DuDpwvMlPEfwjDoPQmqEOsdQcALPKTxfwfM1PO/hof9+0wzcepR9OfllVm6VRpbqLjP0
J7Ozl0QROAgO6NS+ucf9HHe4QMi0pIAdYaIlhCXryBsnxThgUSWnqcN4CskFjLJs7NE8gtfQns7T
e/R3nF3nk7ALC9TpcnRAZmK+SvKxnxSACmLwwMXqdd4Qgqj311HzcIq9nKQ8GtImQhzdwRW8IP7f
JeXZ/qr4KEI0I7u5KyAYvdBT8Celf/JONThWCJe92flTDXq1V9eSEQHsoQxflWgl3cPWo09loCCz
DEgOYzIfelvw+oqUreUiSneuiLl0puIzqqlNWMsmJ4Xegd5HE3IFQWDJsGgtk6Al2SPzAG0ogiU4
PrTmsaliJDoLPs5MFEg8XQwp2ohQ3Rf6QXEVHOPwPptXlo4Czktw1PXTJEKmX8TIA9fLJeEVbsQc
SeZHQmp1rFsi5F0mkcyjWLt5xNacW6RFZRj2YAkNS3JKdS77PGLIGFQXTU7KgOOBbjkYcchjEVvW
BrlQwJT7T5QsFUe2wtP6KMWme0gC4Vd0cllHHXPBxHpjqlaz3vtjg7r+w9l9nH+CA4A167/ecOjK
9V9vaLvs/O9w0Kz/tgHz/X99JailG+oejw+hRvl2kW8YGPIWpczm+9yAyiKqiKe1OQlPyjIeGsst
uawM+BB52rcQMtsCQ540yDofF3eirjx8kHVme8Q2hBdVGPFqqy0i8qyigLO5ApRSnMSClWYETp3t
FEq5luBUJehtLMECSWeEbujUBAlZTnp0I4+zuGEcRCmnPdtUP5K3OVWdT6rwMeWWpyUZptpCpUbF
/seq2FNV7Neq2H+siklRVbGnqthHptym3VzFwceq2FdVHNSqOHisiienVRX7qooDZOpby5sr6n6s
ogNVUbdWUfexih7XaTpQNXVhvC7shy/VVeZmZaZDE77AwyFfGdembFwcHrhGPEaNaDiCmDPi0YL5
FBt1rF+YzO8WWGlhF1LuICacZyUmm1XhTJHjQrYuDio5BVjzG0arRf+z3Kx+//dprwCtu//T6w/k
+T9M/3T+d+1m/t8OPNWOL73nUucLR9wZFi7HmGwFKYYoKxEiyCK2JPq9bfM5QF3+/9QXANf5v+Mw
/x86vQFUs/t/bs9u/H8bYO6hcglAr/gwR66ZgHQ/BoelDbr6Ce/vrUsDjwfV/1/iX4gfhOSpeazz
f9fl57/g9q475Pd/+838vxU4e/Hy4iTxcBR6xuXrs8uTKYkSmAOQnAzkBUA0zw6N716dXfz4t/PL
EyVjnF8ULKcRZHz/zT/Oz97M8bwo4Xj0hePRN8YTXozzf56f/fjmxTcX5yfq7TxYb4ShdmvWMLTY
FMReWExJhrKkSD2SGa1dk2pmoYME7X6Ndk0hCQQ4iXsEpVIRS2ngod33hiEIUSRqliqC4YUEx0e0
/PVLKE19tAc6BOxvgvZ+g5Zzdaw/anBU/V90/ZPzWOP/vEzO/z22/+e4zf3frcDC/t8L6pN8FUru
cESXnHLlKQ4f9PteK5aq7PRBuzKm3g+ruz4mz05ZprHp1UF+PKiedFWuX/KrCfwGZmuW0kMskce0
31z/J0n/DQuPI9SWJzXQnp9faagm4BKGC4EooQceSZHrMrXfQ9P37X3UtgStcZVOyVIlo9khQ+2R
0SrPbfgJFb3hSbcjNJFKdtZcaUOcmXG7aPi8Y9SKmHwIoYgd2rPtlJobpvJYTGctOvl9G8UdAou6
Gc5QQa85cOX2f47bVo0IbQ/0CLFmNtrcx0WWEXRT4HgKTXlL/eiKH14xpfcnVk0HUROBPJQc5b1Q
G/howu90sn0Z0ubXOtucs9KgtAnvxMWLwZOkgMhvWvJKAkP6cA1pE7vGjaaJkFbX+/T0FLq1dCoT
lrnTscpnmsRE9sJ5PKXHrDQX43cqKHNQ4IvL+6wLVAm9bRDcEq4PyMJU4T4g5aO8ghzZbCw0uXkD
DTTQQAMNNNBAAw000EADDTTQQAMNNNBAAw18TvBfpSCFeABQAAA=
--=-=-=
--
PETAZZONI Thomas
thomas.petazzoni@enix.org UIN : 34937744
Projet KOS : http://kos.enix.org
Club LinUT : http://club-linut.enix.org
--=-=-=--