2022-12-13 11:51:46 +01:00

79 lines
2.2 KiB
OCaml

{
open Lexing
open Ast
open Parser (* The type token is defined in parser.mli *)
exception Lexing_error of string
let id_or_keywork =
let h = Hashtbl.create 100 in
List.iter (fun (s,k) -> Hashtbl.add h s k)
[ ("let", LET);
("tel", TEL);
("node", NODE);
("returns", RETURNS);
("var", VAR);
("int", TYP(Ast.TInt));
("real", TYP(Ast.TReal));
("bool", TYP(Ast.TBool));
("not", MO_not);
("mod", BO_mod);
("and", BO_and);
("or", BO_or);
("if", IF);
("then", THEN);
("else", ELSE);
("merge", TO_merge);
("when", WHEN);
("reset", RESET);
("pre", MO_pre);
("true", CONST_BOOL(true));
("false", CONST_BOOL(false));
("fby", BO_fby);
("automaton", AUTOMAT);
("match", MATCH);
("with", WITH);
("until", UNTIL);
("do", DO);
("done", DONE);
];
fun s ->
try Hashtbl.find h s with Not_found -> IDENT s
}
let alpha = ['a'-'z' 'A'-'Z']
let digit = ['0'-'9']
let ident = alpha (alpha | digit | '_')*
rule token = parse
['\n' ' ' '\t'] { token lexbuf } (* skip blanks and newlines *)
| ident { id_or_keywork (lexeme lexbuf) }
| digit+ { CONST_INT(int_of_string (lexeme lexbuf)) }
| digit*'.'digit+ { CONST_REAL(float_of_string (lexeme lexbuf)) }
| ',' { COMMA }
| '=' { EQUAL }
| '(' { LPAREN }
| ')' { RPAREN }
| ';' { SEMICOL }
| ':' { COLON }
| '<' { CMP_lt }
| "<=" { CMP_le }
| '>' { CMP_gt }
| ">=" { CMP_ge }
| "<>" { CMP_neq }
| '+' { PLUS }
| '-' { MINUS }
| '*' { BO_mul }
| '/' { BO_div }
| '%' { BO_mod }
| "->" { BO_arrow }
| '|' { CASE }
| "--" { read_single_line_comment lexbuf }
| eof { EOF }
| _ { raise (Lexing_error (Format.sprintf "Error when seeing %s" (lexeme lexbuf)))}
and read_single_line_comment = parse
| '\n' { token lexbuf }
| eof { EOF }
| _ { read_single_line_comment lexbuf }