xref: /aosp_15_r20/external/llvm/examples/OCaml-Kaleidoscope/Chapter2/lexer.ml (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker(*===----------------------------------------------------------------------===
2*9880d681SAndroid Build Coastguard Worker * Lexer
3*9880d681SAndroid Build Coastguard Worker *===----------------------------------------------------------------------===*)
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerlet rec lex = parser
6*9880d681SAndroid Build Coastguard Worker  (* Skip any whitespace. *)
7*9880d681SAndroid Build Coastguard Worker  | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker  (* identifier: [a-zA-Z][a-zA-Z0-9] *)
10*9880d681SAndroid Build Coastguard Worker  | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
11*9880d681SAndroid Build Coastguard Worker      let buffer = Buffer.create 1 in
12*9880d681SAndroid Build Coastguard Worker      Buffer.add_char buffer c;
13*9880d681SAndroid Build Coastguard Worker      lex_ident buffer stream
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker  (* number: [0-9.]+ *)
16*9880d681SAndroid Build Coastguard Worker  | [< ' ('0' .. '9' as c); stream >] ->
17*9880d681SAndroid Build Coastguard Worker      let buffer = Buffer.create 1 in
18*9880d681SAndroid Build Coastguard Worker      Buffer.add_char buffer c;
19*9880d681SAndroid Build Coastguard Worker      lex_number buffer stream
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker  (* Comment until end of line. *)
22*9880d681SAndroid Build Coastguard Worker  | [< ' ('#'); stream >] ->
23*9880d681SAndroid Build Coastguard Worker      lex_comment stream
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker  (* Otherwise, just return the character as its ascii value. *)
26*9880d681SAndroid Build Coastguard Worker  | [< 'c; stream >] ->
27*9880d681SAndroid Build Coastguard Worker      [< 'Token.Kwd c; lex stream >]
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker  (* end of stream. *)
30*9880d681SAndroid Build Coastguard Worker  | [< >] -> [< >]
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerand lex_number buffer = parser
33*9880d681SAndroid Build Coastguard Worker  | [< ' ('0' .. '9' | '.' as c); stream >] ->
34*9880d681SAndroid Build Coastguard Worker      Buffer.add_char buffer c;
35*9880d681SAndroid Build Coastguard Worker      lex_number buffer stream
36*9880d681SAndroid Build Coastguard Worker  | [< stream=lex >] ->
37*9880d681SAndroid Build Coastguard Worker      [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerand lex_ident buffer = parser
40*9880d681SAndroid Build Coastguard Worker  | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
41*9880d681SAndroid Build Coastguard Worker      Buffer.add_char buffer c;
42*9880d681SAndroid Build Coastguard Worker      lex_ident buffer stream
43*9880d681SAndroid Build Coastguard Worker  | [< stream=lex >] ->
44*9880d681SAndroid Build Coastguard Worker      match Buffer.contents buffer with
45*9880d681SAndroid Build Coastguard Worker      | "def" -> [< 'Token.Def; stream >]
46*9880d681SAndroid Build Coastguard Worker      | "extern" -> [< 'Token.Extern; stream >]
47*9880d681SAndroid Build Coastguard Worker      | id -> [< 'Token.Ident id; stream >]
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerand lex_comment = parser
50*9880d681SAndroid Build Coastguard Worker  | [< ' ('\n'); stream=lex >] -> stream
51*9880d681SAndroid Build Coastguard Worker  | [< 'c; e=lex_comment >] -> e
52*9880d681SAndroid Build Coastguard Worker  | [< >] -> [< >]
53