89 lines
2.5 KiB
OCaml
89 lines
2.5 KiB
OCaml
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;;
|