17abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao(*===----------------------------------------------------------------------===
27abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao * Lexer
37abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao *===----------------------------------------------------------------------===*)
47abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
57abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaolet rec lex = parser
67abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Skip any whitespace. *)
77abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< ' (' ' | '\n' | '\r' | '\t'); stream >] -> lex stream
87abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
97abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* identifier: [a-zA-Z][a-zA-Z0-9] *)
107abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< ' ('A' .. 'Z' | 'a' .. 'z' as c); stream >] ->
117abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      let buffer = Buffer.create 1 in
127abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      Buffer.add_char buffer c;
137abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      lex_ident buffer stream
147abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
157abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* number: [0-9.]+ *)
167abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< ' ('0' .. '9' as c); stream >] ->
177abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      let buffer = Buffer.create 1 in
187abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      Buffer.add_char buffer c;
197abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      lex_number buffer stream
207abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
217abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Comment until end of line. *)
227abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< ' ('#'); stream >] ->
237abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      lex_comment stream
247abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
257abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* Otherwise, just return the character as its ascii value. *)
267abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< 'c; stream >] ->
277abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      [< 'Token.Kwd c; lex stream >]
287abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
297abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  (* end of stream. *)
307abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< >] -> [< >]
317abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
327abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoand lex_number buffer = parser
337abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< ' ('0' .. '9' | '.' as c); stream >] ->
347abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      Buffer.add_char buffer c;
357abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      lex_number buffer stream
367abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< stream=lex >] ->
377abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      [< 'Token.Number (float_of_string (Buffer.contents buffer)); stream >]
387abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
397abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoand lex_ident buffer = parser
407abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< ' ('A' .. 'Z' | 'a' .. 'z' | '0' .. '9' as c); stream >] ->
417abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      Buffer.add_char buffer c;
427abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      lex_ident buffer stream
437abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< stream=lex >] ->
447abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      match Buffer.contents buffer with
457abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "def" -> [< 'Token.Def; stream >]
467abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "extern" -> [< 'Token.Extern; stream >]
477abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "if" -> [< 'Token.If; stream >]
487abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "then" -> [< 'Token.Then; stream >]
497abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "else" -> [< 'Token.Else; stream >]
507abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "for" -> [< 'Token.For; stream >]
517abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "in" -> [< 'Token.In; stream >]
527abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "binary" -> [< 'Token.Binary; stream >]
537abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "unary" -> [< 'Token.Unary; stream >]
547abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | "var" -> [< 'Token.Var; stream >]
557abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao      | id -> [< 'Token.Ident id; stream >]
567abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao
577abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoand lex_comment = parser
587abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< ' ('\n'); stream=lex >] -> stream
597abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< 'c; e=lex_comment >] -> e
607abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao  | [< >] -> [< >]
61