forked from ocaml/opam
-
Notifications
You must be signed in to change notification settings - Fork 4
/
lexer.mll
70 lines (64 loc) · 2.55 KB
/
lexer.mll
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
{
(***********************************************************************)
(* *)
(* Copyright 2012 OCamlPro *)
(* Copyright 2012 INRIA *)
(* *)
(* All rights reserved. This file is distributed under the terms of *)
(* the GNU Public License version 3.0. *)
(* *)
(* TypeRex is distributed in the hope that it will be useful, *)
(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)
(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)
(* GNU General Public License for more details. *)
(* *)
(***********************************************************************)
open Parser
let newline lexbuf = Lexing.new_line lexbuf
}
let space = [' ' '\t' '\r' '\n']
let alpha = ['a'-'z' 'A'-'Z' '_']
let digit = ['0'-'9']
let char = ['-']
let ident = alpha (alpha | digit | char)*
let symbol = ['=' '<' '>' '!' '+' ]+
let number = '-'? ('.'['0'-'9']+ | ['0'-'9']+('.'['0'-'9']*)? )
rule token = parse
| space { token lexbuf }
| "\n" { newline lexbuf; token lexbuf }
| ":" { COLON }
| "{" { LBRACE }
| "}" { RBRACE }
| "[" { LBRACKET }
| "]" { RBRACKET }
| "(" { LPAR }
| ")" { RPAR }
| '"' { let s = string "" lexbuf in
STRING s }
| "(*" { comment 1 lexbuf; token lexbuf }
| "true" { BOOL true }
| "false"{ BOOL false }
| "\n" { Lexing.new_line lexbuf; token lexbuf }
| digit+ { INT (int_of_string (Lexing.lexeme lexbuf)) }
| ident { IDENT (Lexing.lexeme lexbuf) }
| symbol { SYMBOL (Lexing.lexeme lexbuf) }
| eof { EOF }
| _ { let token = Lexing.lexeme lexbuf in
Globals.error_and_exit "lexer error: '%s' is not a valid token" token }
(* XXX: not optimal at all *)
and string s = parse
| '"' { s }
| "\n" { newline lexbuf;
string (s ^ Lexing.lexeme lexbuf) lexbuf }
| "\\\"" { string (s ^ "\"") lexbuf }
| "\\\\" { string (s ^ "\\") lexbuf }
| "\\" [^ '"' '\\']+
{ string (s ^ Lexing.lexeme lexbuf) lexbuf }
| eof { s }
| _ { string (s ^ Lexing.lexeme lexbuf) lexbuf }
and comment n = parse
| "*)" { if n > 1 then comment (n-1) lexbuf }
| "(*" { comment (n+1)lexbuf }
| eof { }
| "\n" { newline lexbuf; comment n lexbuf }
| _ { comment n lexbuf }