-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathlexer.mll
47 lines (42 loc) · 2.13 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
{
open Parser
exception Error of string
}
let digit = ['0'-'9']
let one_to_nine = ['1'-'9']
let int = ('-'? one_to_nine digit*) | '0'
let frac = '.' digit*
let exp = ['e''E'] ['-''+']? digit+
let float = digit* frac? exp?
let white = [' ''\t']+
let newline = '\r' | '\n' | "\r\n"
let id = ['a'-'z' 'A'-'Z' '_'] ['a'-'z' 'A'-'Z' '_' '0'-'9']*
rule token = parse
| white { token lexbuf }
| newline { Lexing.new_line lexbuf; token lexbuf }
| int { INT ( int_of_string (Lexing.lexeme lexbuf) ) }
| float { FLOAT ( float_of_string (Lexing.lexeme lexbuf) ) }
| "true" { TRUE }
| "false" { FALSE }
| "null" { NULL }
| '{' { LBRACE }
| '}' { RBRACE }
| '[' { LBRACK }
| ']' { RBRACK }
| ':' { COLON }
| ',' { COMMA }
| '"' { read_string (Buffer.create 17) lexbuf }
| eof { EOF }
| _ { raise (Error ("Unexpected char: " ^ (Lexing.lexeme lexbuf))) }
and read_string buffer = parse
| '"' { STRING( Buffer.contents buffer ) }
| '\\' '/' { Buffer.add_char buffer '/'; read_string buffer lexbuf }
| '\\' '\\' { Buffer.add_char buffer '\\'; read_string buffer lexbuf }
| '\\' 'b' { Buffer.add_char buffer '\b'; read_string buffer lexbuf }
| '\\' 'f' { Buffer.add_char buffer '\012'; read_string buffer lexbuf }
| '\\' 'n' { Buffer.add_char buffer '\n'; read_string buffer lexbuf }
| '\\' 'r' { Buffer.add_char buffer '\r'; read_string buffer lexbuf }
| '\\' 't' { Buffer.add_char buffer '\t'; read_string buffer lexbuf }
| [^'"' '\\']+ { Buffer.add_string buffer (Lexing.lexeme lexbuf); read_string buffer lexbuf }
| eof { raise (Error ("Literal string is not terminated")) }
| _ { raise (Error ("Illegal string character: " ^ Lexing.lexeme lexbuf)) }