TP-automates/BE/descendant/Tokens.ml

89 lines
2.5 KiB
OCaml
Raw Normal View History

2023-06-21 17:58:18 +00:00
open List
type token =
| UL_MODEL
| UL_SYSTEM
| UL_BLOCK
| UL_FLOW
| UL_FROM
| UL_TO
| UL_IN
| UL_OUT
| UL_INT
| UL_FLOAT
| UL_BOOLEAN
| UL_ACCOUV
| UL_ACCFER
| UL_PAROUV
| UL_PARFER
| UL_CROOUV
| UL_CROFER
| UL_PTV
| UL_VIRG
| UL_PT2
| UL_PT
| UL_IDENT of string
| UL_PORT of string
| UL_ENTIER of int
| UL_FIN
| UL_ERREUR;;
type inputStream = token list;;
(* string_of_token : token -> string *)
(* Converti un token en une chaîne de caractère*)
let string_of_token token =
match token with
| UL_MODEL -> "model"
| UL_SYSTEM -> "system"
| UL_BLOCK -> "block"
| UL_FLOW -> "flow"
| UL_FROM -> "from"
| UL_TO -> "to"
| UL_IN -> "in"
| UL_OUT -> "out"
| UL_INT -> "int"
| UL_FLOAT -> "float"
| UL_BOOLEAN -> "boolean"
| UL_ACCOUV -> "{"
| UL_ACCFER -> "}"
| UL_PAROUV -> "("
| UL_PARFER -> ")"
| UL_CROOUV -> "["
| UL_CROFER -> "]"
| UL_PTV -> ";"
| UL_VIRG -> ","
| UL_PT2 -> ":"
| UL_PT -> "."
| UL_IDENT texte -> texte
| UL_PORT texte -> texte
| UL_ENTIER texte -> (string_of_int texte)
| UL_FIN -> "EOF"
| UL_ERREUR -> "Erreur Lexicale";;
(* string_of_stream : inputStream -> string *)
(* Converti un inputStream (liste de token) en une chaîne de caractère *)
let string_of_stream stream =
List.fold_right (fun t tq -> (string_of_token t) ^ " " ^ tq ) stream "";;
(* peekAtFirstToken : inputStream -> token *)
(* Renvoie le premier élément d'un inputStream *)
(* Erreur : si l'inputStream est vide *)
let peekAtFirstToken stream =
match stream with
(* Normalement, ne doit jamais se produire sauf si la grammaire essaie de lire *)
(* après la fin de l'inputStream. *)
| [] -> failwith "Impossible d'acceder au premier element d'un inputStream vide"
|t::_ -> t;;
(* advanceInStream : inputStream -> inputStream *)
(* Consomme le premier élément d'un inputStream *)
(* Erreur : si l'inputStream est vide *)
let advanceInStream stream =
match stream with
(* Normalement, ne doit jamais se produire sauf si la grammaire essaie de lire *)
(* après la fin de l'inputStream. *)
| [] -> failwith "Impossible de consommer le premier element d'un inputStream vide"
| _::q -> q;;