Source

Caml / MiniProj / CodesFournis / lexer.mll

(* File lexer.mll *)
{
  open Parser        (* The type token is defined in parser.mli *)
  exception Eof

  let h = Hashtbl.create 29
  let _ =
    List.iter (fun (k,t) -> Hashtbl.add h k t)
      [
        ("+",ADD); ("*",MUL);
        ("-",MIN); ("/",DIV);
        ("<",LT); (">",GT);
        ("<=",LEQ); (">=",GEQ);
        ("==",CMPEQ);(",",COM);
        ("!",NOT);("&&",AND);("||",OR);
        ("{",LB); ("}",RB);
        ("=",EQ); (";",SC);
        ("(",LPAREN); (")",RPAREN);
      ]

  let keys = Hashtbl.create 13
  let _ =
    List.iter (fun (k,t) -> Hashtbl.add keys k t)
      [
        ("main",MAIN);
        ("if",IF);
        ("while",WHILE);
        ("else",ELSE);
        ("return",RETURN);
        ("vars",VARS);
      ]

}
let ident = ['a'-'z']['a'-'z' '_' '0'-'9']*

let white = [' ' '\t' '\n']

let num = '-'?['0'-'9']['0'-'9']*

let op = "+" | "*" | "-" | "/" | "<" | ">" | ">=" | "<=" | "=="
  | "," | "{" | "}" | "=" | ";" | "(" | ")" | "!" | "||" | "&&"

rule token = parse
    white+         { token lexbuf }     (* skip blanks *)
  | num  as n      { INT (int_of_string n) }
  | ident as ato   {
    try Hashtbl.find keys ato with
      | Not_found -> VAR ato
  }
  | op             { Hashtbl.find h (Lexing.lexeme lexbuf)}
  | eof            { EOF }
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.