Bonjour,
Je n'ai pas trouvé comment résoudre le problème suivant : j'aurais besoin, sur une règle de ocamllex, de renvoyer plusieurs tokens à la suite.
Je m'explique : je suis en train d'écrire un parser pour Delphi, et en Delphi :
- " 1. " désigne une valeur de type "float"
- " [1..2] " désigne une valeur de type "ensemble d'entier"
Ce qui veut dire que quand on lit sur l'entrée du lexer les caractères "1.", il faut encore lire un caractère pour savoir si la suite du code est "1.." - et dans ce cas, le caractère 1 représente l'entier 1 suivi de l'opérateur ".." - ou si "1." est une valeur réelle à virgule flottante.
Je vois le principe à suivre, mais je n'ai pas compris comment je pouvais le coder avec ocamllex :
1- émettre 2 tokens à la suite :
2 - remettre les caractères lus dans le lexbuf :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 let digit = ['0'-'9'] rule monLexer = parse | (digit+ as inum) ".." { (INT inum); RANGE } (* Comment dois-je modiifer mon code pour pouvoir émettre 2 tokens à la suite, sans manger de caractère supplémentaire de l'input? *) | digit+ '.' digit* as ifloat { FLOAT ifloat }
J'espère que ma question est compréhensible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 rule monLexer = parse | (digit+ as inum) ".." { reload_in_lexbuf lexbuf ".."; (* Je n'ai pas trouvé de telle fonction dans la doc, ni dans lexing.mli. cf yyless en lex *) (INT inum) } | digit+ '.' digit* as ifloat { FLOAT ifloat }
Merci d'avance pour vos (nombreuses) réponses.
Partager