79 lines
2.2 KiB
OCaml
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 }
|