Seems to work
[rops.git] / lexer.mll
blob413c216793e38491183579a99550f2a0c6c41e8a
1 (*\r
2   Scanner For A Scheme\r
3   \r
4   Known problems: 1s gets parsed as (Int 1) + (Symbol s). We should probably introduce a rule for invalid numbers that throws an error.\r
5 \r
6  *)\r
7 {\r
8 open Parser;;\r
9 \r
10 exception Eof;;\r
12 let incr_linenum lexbuf =\r
13   let pos = lexbuf.Lexing.lex_curr_p in\r
14   lexbuf.Lexing.lex_curr_p <- { pos with\r
15                                 Lexing.pos_lnum = pos.Lexing.pos_lnum + 1;\r
16                                 Lexing.pos_bol = pos.Lexing.pos_cnum;\r
17                               };;\r
19 let make_string x = STRING (String.sub x 1 ((String.length x) - 2));;\r
21 }\r
23 let newline = ['\n']\r
24 let spaces = ['\r' '\t' ' ']\r
25 let letter = ['a'-'z' 'A'-'Z']\r
26 let digit = ['0'-'9']\r
27 let arith_ops = ['*' '/' '+' '-' '=']\r
28 let punctuation = ['!' '#'  '$'  '%'  '&'  '|'  '*'  \r
29                    '+' '-'  '/'  ':'  '<'  '='  '>'  '?'  \r
30                    '@'  '^'  '_'  '~'  '\"']\r
32 let delimiter = "\n\r"|['[' ']' '(' ')' '"' ';' '#' '\r' '\n' '\t' ' ']\r
33   \r
34 let symbol = letter+ (digit|punctuation|letter)*\r
35 let scheme_string = '"' (('\\' _ )|[^ '"'])* '"'\r
37 rule token = parse\r
38 | '\n' \r
39     {\r
40       incr_linenum lexbuf; \r
41       token lexbuf\r
42     }\r
43 | scheme_string as s  { make_string s }\r
44 | spaces+ { token lexbuf }\r
45 | digit+ as inum \r
46     {\r
47       INT (int_of_string inum)\r
48     }\r
49 | arith_ops as op { SYMBOL (Char.escaped op) }\r
50 | symbol as s { SYMBOL s }\r
51 | ';' [^ '\n']* { token lexbuf }        (* eat up one-line comments *)\r
52 | '[' { LBRACKET  }\r
53 | ']' { RBRACKET }\r
54 | '(' { LPAREN }\r
55 | ')' { RPAREN }\r
56 | eof { raise Eof }\r