summaryrefslogblamecommitdiff
path: root/frontend/lexer.mll
blob: 837ee75a4dc8374069b911bad681c9bdd319af0d (plain) (tree)
1
2
3
4
5
6
7
8
 






                                                              





                          
                             













                            
                             





                              
                            






                              
     


 


                                  


                          





                                                                                    
                                   
 



























                                                              
                                            




                                             
 
                   


                                               




                                                  
{
  open Lexing
  open Ast
  open Parser

  let kwd_table = Hashtbl.create 10
  let () = List.iter (fun (a, b) -> Hashtbl.add kwd_table a b)
    [
      "bool",       BOOL;
      "int",        INT;
      "real",       REAL;

      "const",      CONST;
      "node",       NODE;
      "function",   FUNCTION;
      "returns",    RETURNS;
      "var",        VAR;
      "let",        LET;
      "tel",        TEL;

      "if",         IF;
      "then",       THEN;
      "else",       ELSE;
      "pre",        PRE;
      "not",        NOT;
      "and",        AND;
      "or",         OR;
      "mod",        MOD;

      "activate",   ACTIVATE;
      "automaton",  AUTOMATON;
      "state",      STATE;
      "initial",    INITIAL;
      "unless",     UNLESS;
      "until",      UNTIL;
      "resume",     RESUME;
      "restart",    RESTART;

      "true",       TRUE;
      "false",      FALSE;

      "assume",     ASSUME;
      "guarantee",  GUARANTEE;
      "probe",      PROBE;
    ]
}


let space = [' ' '\t' '\r']+
let newline = "\n" | "\r" | "\r\n"

let digit = ['0'-'9']
let digit_ = ['0'-'9' '_']

let int_dec = digit digit_*
let int_bin = ("0b" | "0B") ['0'-'1'] ['0'-'1' '_']*
let int_oct = ("0o" | "0O") ['0'-'7'] ['0'-'7' '_']*
let int_hex = ("0x" | "0X") ['0'-'9' 'a'-'f' 'A'-'F'] ['0'-'9' 'a'-'f' 'A'-'F' '_']*
let const_int = int_bin | int_oct | int_dec | int_hex

let const_real = digit_+ '.' digit*

rule token = parse
  (* identifier (TOK_id) or reserved keyword *)
  | ['a'-'z' 'A'-'Z' '_'] ['a'-'z' 'A'-'Z' '0'-'9' '_']* as id
  { try Hashtbl.find kwd_table id with Not_found -> IDENT id }
  (* symbols *)
  | "("    { LPAREN }
  | ")"    { RPAREN }
  | "{"    { LCURLY }
  | "}"    { RCURLY }
  | "*"    { STAR }
  | "+"    { PLUS }
  | "-"    { MINUS }
  | "/"    { DIVIDE }
  | "<"    { LESS }
  | ">"    { GREATER }
  | "<="   { LESS_EQUAL }
  | ">="   { GREATER_EQUAL }
  | "<>"   { DIFF }
  | "="    { EQUAL }
  | ";"    { SEMICOLON }
  | ":"    { COLON }
  | ","    { COMMA }
  | "->"   { ARROW }
  (* literals *)
  | const_int    as c { INTVAL c }
  | const_real   as c { REALVAL c }
  (* spaces, comments *)
  | "(*" { comment lexbuf; token lexbuf }
  | "/*" { cppcomment lexbuf; token lexbuf }
  | "--" [^ '\n' '\r']* { token lexbuf }
  | newline { new_line lexbuf; token lexbuf }
  | space { token lexbuf }
  (* end of files *)
  | eof { EOF }

and comment = parse
  | "*)" { () }
  | [^ '\n' '\r'] { comment lexbuf }
  | newline { new_line lexbuf; comment lexbuf }

and cppcomment = parse
  | "*/" { () }
  | [^ '\n' '\r'] { cppcomment lexbuf }
  | newline { new_line lexbuf; cppcomment lexbuf }