{ (** * lexer.mll * ColorML_v2 project * (C) Lilian Besson, 2014 *) open Parser let parstarstar = ref 0 and parstar = ref 0 ;; let string_of_char = String.make 1 and char_of_string s = s.[0] ;; let intocomment = ref "";; let addintocomment c = intocomment := !intocomment ^ (string_of_char c);; let addintocomments s = print_string ("\nRajout de ["^s^"] dans le commentaire courant."); (* flush_all ();*) intocomment := !intocomment ^ s;; } let digit = ['0'-'9'] let spaces = ['\n' '\t' ' '] let letter = ['a'-'z' 'A'-'Z' '_' '\''] let charac = [' '-'~'] let majuscules = ['A'-'Z'] let hexa = ['a'-'f' 'A'-'F' '0'-'9'] let octa = ['0'-'8'] let expo = ['e' 'E'] let special = [ '\\' '\169' '\160' '\167' '\168' '\170' '\180' '\195' '\185' '\175'] let part_of_name = (digit | spaces) let no_part_of_name = [^ '0'-'9' 'a'-'z' 'A'-'Z' '_' '\'' '\n' '\t' ' '] let no_part_of_name_spec = [^ '0'-'9' 'a'-'z' 'A'-'Z' '_' '\''] rule token = parse (* | '\n' { NOUVELLE_LIGNE(1); token lexbuf }*) (* | '\t' { TABULATION(1); token lexbuf }*) (* | ' ' { ESPACE(1); token lexbuf }*) | '\n' { NOUVELLE_LIGNE(1) } | '\t' { TABULATION(1) } | ' ' { ESPACE(1) } | (("\"" "\\" "\"" ([^'\"']|([^'\\']'\\''\"'))* "\"")|("\"" ([^'\"']|([^'\\']'\\''\"'))* "\"")) as k { CHAINE_DE_CARACTERES(k) } | (letter | special) as k { RIEN_DE_SPECIAL(string_of_char(k)) } (* | _ as k { RIEN_DE_SPECIAL(string_of_char(k)) }*) (* | '\n'("true"|"false"|"None"|"Some")(no_part_of_name) as k { NOUVELLE_LIGNE(1); CONSTANTES((StringLabels.sub k ~pos:1 ~len:((String.length k) - 2))); token (Lexing.from_string (string_of_char (k.[(String.length k) - 1]))) }*) (* | '\t'("true"|"false"|"None"|"Some")(no_part_of_name) as k { TABULATION(1); CONSTANTES((StringLabels.sub k ~pos:1 ~len:((String.length k) - 2))); token (Lexing.from_string (string_of_char (k.[(String.length k) - 1]))) }*) (* | ' '("true"|"false"|"None"|"Some")(no_part_of_name) as k { ESPACE(1); CONSTANTES((StringLabels.sub k ~pos:1 ~len:((String.length k) - 2))); token (Lexing.from_string (string_of_char (k.[(String.length k) - 1]))) }*) (* | (no_part_of_name)("true"|"false"|"None"|"Some")(no_part_of_name) as k { CONSTANTES((StringLabels.sub k ~pos:1 ~len:((String.length k) - 2))); token (Lexing.from_string (string_of_char (k.[(String.length k) - 1]))) }*) (* | (no_part_of_name_spec)("true"|"false"|"None"|"Some")(no_part_of_name_spec) as k { CONSTANTES_SPEC(k) }*) (* | (no_part_of_name_spec)("true"|"false"|"None"|"Some") as k { CONSTANTES_SPECG(k) }*) (* | ("true"|"false"|"None"|"Some")(no_part_of_name_spec) as k { CONSTANTES_SPECD(k) }*) (* | ((no_part_of_name) as c1) (("true"|"false"|"None"|"Some") as k) ((no_part_of_name) as c2) { token (Lexing.from_string (string_of_char c1)); CONSTANTES(k); token (Lexing.from_string (string_of_char c2)) }*) | ("true"|"false"|"None"|"Some") as k { CONSTANTES(k) } | ("asr"|"land"|"lazy"|"lor"|"lsl"|"lxor"|"mod"|"or"|"lnot") as k { MOT_CLES_FUNCTION_LIKE(k) } (* | (no_part_of_name_spec)("asr"|"land"|"lazy"|"lor"|"lsl"|"lxor"|"mod"|"or"|"lnot")(no_part_of_name_spec) as k { MOT_CLES_FUNCTION_LIKE_SPEC(k) }*) | ("Arg"|"Arith_status"|"Array"|"ArrayLabels"|"Big_int"|"Bigarray"|"Buffer"|"Callback"|"CamlinternalMod"|"CamlinternalOO"|"Char"|"Complex"|"Condition"|"Dbm"|"Digest"|"DynLink"|"Event"|"Filename"|"Format"|"Gc"|"Genlex"|"Graphics"|"GraphicsX11"|"Hashtbl"|"Int32"|"Int64"|"LargeFile"|"Lazy"|"Lexing"|"List"|"ListLabels"|"Map"|"Marshal"|"MoreLabels"|"Mutex"|"Nativeint"|"naereen"|"Num"|"Oo"|"Parsing"|"Printexc"|"Printf"|"Queue"|"Random"|"Scanf"|"Set"|"Sort"|"Stack"|"StdLabels"|"Str"|"Stream"|"StringLabels"|"Sys"|"Thread"|"ThreadUnix"|"Unix"|"UnixLabels"|"Weak") as k { MODULES_STANDARDS(k) } (* | (no_part_of_name_spec)("Arg"|"Arith_status"|"Array"|"ArrayLabels"|"Big_int"|"Bigarray"|"Buffer"|"Callback"|"CamlinternalMod"|"CamlinternalOO"|"Char"|"Complex"|"Condition"|"Dbm"|"Digest"|"DynLink"|"Event"|"Filename"|"Format"|"Gc"|"Genlex"|"Graphics"|"GraphicsX11"|"Hashtbl"|"Int32"|"Int64"|"LargeFile"|"Lazy"|"Lexing"|"List"|"ListLabels"|"Map"|"Marshal"|"MoreLabels"|"Mutex"|"Nativeint"|"naereen"|"Num"|"Oo"|"Parsing"|"Printexc"|"Printf"|"Queue"|"Random"|"Scanf"|"Set"|"Sort"|"Stack"|"StdLabels"|"Str"|"Stream"|"StringLabels"|"Sys"|"Thread"|"ThreadUnix"|"Unix"|"UnixLabels"|"Weak") (no_part_of_name_spec) as k { MODULES_STANDARDS_SPEC(k) }*) | (".("|".["|"("|")"|"["|"]"|"{"|"}"|"[|"|"|]") as k { PARENTHESES(k) } | ("."|"+"|"$"|"-"|"*"|"**"|"/"|"!"|"#"|"?"|"+."|"-."|"*."|"**."|"/."|"~"|"<>"|">"|"<"|"!="|"^"|"="|"--"|"---"|"@"|":"|";"|","|"&&"|"&"|"|"|"||"|"!>"|"!<"|"%"|"\\\\") as k { OPERATEURS(k) } | ['-']? digit+ as valeur_entiere { NOMBRES(valeur_entiere) } | ['-']? digit+ expo? ['-']? digit+ as valeur_entiere { NOMBRES(valeur_entiere) } | "0x" hexa+ as valeur_entiere { NOMBRES(valeur_entiere) } | "0o" octa+ as valeur_entiere { NOMBRES(valeur_entiere) } | ("as"|"class"|"constraint"|"exception"|"external"|"functor"|"include"|"inherit"|"initializer"|"method"|"module"|"mutable"|"new"|"object"|"of"|"open"|"private"|"struct"|"sig"|"type"|"virtual") as k { STATEMENT2(k) } (* | (no_part_of_name_spec)("as"|"class"|"constraint"|"exception"|"external"|"functor"|"include"|"inherit"|"initializer"|"method"|"module"|"mutable"|"new"|"object"|"of"|"open"|"private"|"struct"|"sig"|"type"|"virtual") (no_part_of_name_spec) as k { STATEMENT2_SPEC(k) }*) | ("and"|"assert"|"begin"|"do"|"done"|"downto"|"else"|"end"|"for"|"fun"|"function"|"if"|"in"|"let"|"match"|"rec"|"then"|"to"|"try"|"val"|"when"|"while"|"with") as k { STATEMENT(k) } (* | (no_part_of_name_spec)("and"|"assert"|"begin"|"do"|"done"|"downto"|"else"|"end"|"for"|"fun"|"function"|"if"|"in"|"let"|"match"|"rec"|"then"|"to"|"try"|"val"|"when"|"while"|"with") (no_part_of_name_spec) as k { STATEMENT_SPEC(k) }*) | majuscules (letter | digit)* as valeure_chaine { EXCEPTION_ET_MODULES(valeure_chaine) } | ([':'' ']"int32"|[':'' ']"int64"|[':'' ']"option"|[':'' ']"ignore"|[':'' ']"ref"|[':'' ']"array"|[':'' ']"bool"|[':'' ']"char"|[':'' ']"float"|[':'' ']"int"|[':'' ']"list"|[':'' ']"string"|[':'' ']"unit") as k { TYPES_DE_BASES(k) } (* | (no_part_of_name_spec)("int32"|"int64"|"option"|"ignore"|"ref"|"array"|"bool"|"char"|"float"|"int"|"list"|"string"|"unit")(no_part_of_name_spec) as k { TYPES_DE_BASES_SPEC(k) }*) (* | "\"" ("\\\""|'\\''\\'|[^ '\"'])* "\"" as k { CHAINE_DE_CARACTERES(k) }*) (*from mli.ml.conf for JOTA : string=""|"(.|[\\\\])*?([^\\]|(\\\\))" *) (* | ("\"\""|"\"\\\\\""|"\"\\\"\""|"\"" ([^ '\"']|([^ '\\']('\\''\"'))|(letter | special)|('\\''\\'))* ([^ '\"']|('\\''\\')) "\"") as k { CHAINE_DE_CARACTERES(k) }*) (* | ("\"\""|"\"\\\\\""|"\"" ([^ '\"']|([^ '\\']('\\''\"'))|(letter | special)|('\\''\\'))* ([^ '\"']|('\\''\\')) "\"") as k { CHAINE_DE_CARACTERES(k) }*) (* | ("\"" ("\\" "\"")? ([^'\"']|([^'\\']'\\''\"'))* "\"") as k { CHAINE_DE_CARACTERES(k) }*) | "\'" ( letter | digit | ' ' | '\n' | '\t' | '\b' | '\\' digit digit digit ) "\'" as k { CHAINE_DE_CARACTERES(k) } | "#" ("use" | "load" | "!" ) [ ' ' '\t' ]* "\"" (letter | digit | '\t' | '.' | ' ')* "\"" ';'';' as k { PREPROCESSEUR(k) } | "(**" (([^'*']|')')('*'|[^')']))* "*)" as k { COMMENTAIRE_ODOC(k) } | "(*" (([^'*']|')')('*'|[^')']))* "*)" as k { COMMENTAIRE_SIMPLE(k) } (* | "(*" { incr parstar; comment_simple lexbuf; token lexbuf }*) (* | ([^ '\n']|[^ ' ']|[^ '\t'])* as k { RIEN_DE_SPECIAL(k) }*) (* | (no_part_of_name) (part_of_name)+ (no_part_of_name) as k { RIEN_DE_SPECIAL(k) }*) (* | [^part_of_name] (part_of_name)+ [^part_of_name] as k { RIEN_DE_SPECIAL(k); token lexbuf }*) | eof { EOF } (* | _* as k { print_string "RIEN_DE_SPECIAL trouvé.\n"; RIEN_DE_SPECIAL(k)}*) (* | _ { print_string ("Mauvais caractere '" ^ (Lexing.lexeme lexbuf) ^ "'."); token lexbuf }*) | _ { token lexbuf } (*and comment_odoc = parse*) (*(* | '*'')' { decr parstarstar; if (!parstarstar = 0) then COMMENTAIRE_ODOC(!intocomment ^ "*)") else comment_odoc lexbuf }*)*) (* | _* as c '*'')' { addintocomments c; COMMENTAIRE_ODOC(!intocomment ^ "*)") }*) (* | eof { failwith ("Fin du fichier au milieu d'un commentaire odoc.") }*) (*and comment_simple = parse*) (*(* | '*'')' { decr parstar; if (!parstarstar = 0) then COMMENTAIRE_SIMPLE(!intocomment ^ "*)") else comment_simple lexbuf }*)*) (* | _* as c '*'')' { addintocomments c; COMMENTAIRE_SIMPLE(!intocomment ^ "*)") }*) (* | eof { failwith ("Fin du fichier au milieu d'un commentaire simple.") }*) (* and comment_odoc = parse | "*)" { decr parstarstar; if (!parstarstar = 0) then (parstarstar := 0; let ss = (String.copy (""^(!intocomment)^""^"")) in intocomment := ss; COMMENTAIRE_ODOC(ss ^ "*)")) else (addintocomments "*)"; comment_odoc lexbuf;) } | ((_? [^ '*'] _?)*|(_? [^ ')'] _?) as c { addintocomments c; token lexbuf } | eof { failwith ("Fin du fichier au milieu d'un commentaire odoc.") } and comment_simple = parse | "*)" { decr parstar; if (!parstar = 0) then (parstar := 0; let ss = (String.copy (""^(!intocomment)^""^"")) in intocomment := ss; COMMENTAIRE_SIMPLE(ss ^ "*)")) else (addintocomments "*)"; comment_simple lexbuf) } | ((_? [^ '*'] _?)*|(_? [^ ')'] _?) as c { addintocomments c; token lexbuf } | eof { failwith ("Fin du fichier au milieu d'un commentaire simple.") } *)