2010-08-09 36 views
4

Existe-t-il un moyen de renvoyer plusieurs jetons dans OCamlLex? J'essaye d'écrire un lexeur et un analyseur pour un langage basé sur l'indentation, et je voudrais que mon lexer retourne plusieurs jetons DEDENT quand il remarque que le niveau d'indentation est inférieur à ce qu'il était auparavant. Cela lui permettra d'avertir l'analyseur lorsque plusieurs blocs sont terminés.Renvoyer plusieurs jetons dans ocamllex

En suivant cette méthode, je serais en mesure d'utiliser INDENT et DEDENT comme remplacements de substitution pour BEGIN et END, comme ces deux jetons seraient impliqués par les INDENT et DEDENT jetons.

Répondre

6

Renvoie la liste des jetons. Si l'analyseur ne peut pas gérer nativement que (par exemple ocamlyacc) - il suffit d'insérer un cache entre:

let cache = 
    let l = ref [] in 
    fun lexbuf -> 
    match !l with 
    | x::xs -> l := xs; x 
    | [] -> match Lexer.tokens lexbuf with 
      | [] -> failwith "oops" 
      | x::xs -> l := xs; x 

Ou vous pouvez exécuter le lexer sur le document, puis exécutez l'analyseur sur le flux jeton complet.

Avez-vous vu ocaml+twt?

+0

Merci, je vais essayer bientôt, et voir si je peux faire ce travail pour moi. Cela peut être un peu ennuyeux, car le jeton DEDENT est le seul qui peut apparaître plusieurs fois, mais je peux contourner ce problème. –