-
Notifications
You must be signed in to change notification settings - Fork 0
/
lexer.ml
43 lines (40 loc) · 1.29 KB
/
lexer.ml
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
let rec lex = parser
(* Ignore whitespaces *)
| [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
(* Identifier *)
| [< ' ('A'..'Z' | 'a'..'z' as c); stream >] ->
let buffer = Buffer.create 1 in
Buffer.add_char buffer c;
lex_ident buffer stream
(* Number *)
| [< ' ('0'..'9' as c); stream >] ->
let buffer = Buffer.create 1 in
Buffer.add_char buffer c;
lex_number buffer stream
(* Comment *)
| [< ' ('#'); stream >] ->
lex_comment stream
(* Return as ASCII value *)
| [< 'c; stream >] ->
[< 'Token.Kwd c; lex stream >]
(* End of stream *)
| [< >] -> [< >]
and lex_ident buffer = parser
| [< ' ('A'..'Z' | 'a'..'z' | '0'..'9' as c); stream >] ->
Buffer.add_char buffer c;
lex_ident buffer stream
| [< stream=lex >] ->
match Buffer.contents buffer with
| "def" -> [< 'Token.Def; stream >]
| "extern" -> [< 'Token.Extern; stream >]
| id -> [< 'Token.Ident id; stream >]
and lex_number buffer = parser
| [< ' ('0'..'9' | '.' as c); stream >] ->
Buffer.add_char buffer c;
lex_number buffer stream
| [< stream=lex >] ->
[< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
and lex_comment = parser
| [< ' ('\n'); stream=lex >] -> stream
| [< 'c; e=lex_comment >] -> e
| [< >] -> [< >]