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 | id -> [< 'Token.Ident id; stream >] 557abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao 567abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liaoand lex_comment = parser 577abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | [< ' ('\n'); stream=lex >] -> stream 587abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | [< 'c; e=lex_comment >] -> e 597abe37e4aee38cc79d91dd069a37d7e91d5bef53Shih-wei Liao | [< >] -> [< >] 60