-
Notifications
You must be signed in to change notification settings - Fork 0
/
lexer.mll
60 lines (55 loc) · 1.83 KB
/
lexer.mll
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
{
open Parser
exception Error of string
let get_range = Range.from_lexer
}
let space = [' ' '\t']
let break = ['\n']
let digit = ['0'-'9']
let capital = ['A'-'Z']
let small = ['a'-'z']
let latin = ( small | capital )
let identifier = (small (digit | latin | "_")*)
rule expr = parse
| space { expr lexbuf }
| break { begin Range.update_line lexbuf ; expr lexbuf end }
| "(" { LPAREN(get_range lexbuf) }
| ")" { RPAREN(get_range lexbuf) }
| "+" { PLUS(get_range lexbuf) }
| "-" { MINUS(get_range lexbuf) }
| "*" { TIMES(get_range lexbuf) }
| "/" { DIVIDES(get_range lexbuf) }
| "." { DOT(get_range lexbuf) }
| "\\" { LAMBDA(get_range lexbuf) }
| "=" { DEFEQ(get_range lexbuf) }
| "==" { EQUAL(get_range lexbuf) }
| ">" { GT(get_range lexbuf) }
| "<" { LT(get_range lexbuf) }
| ">=" { GEQ(get_range lexbuf) }
| "<=" { LEQ(get_range lexbuf) }
| "&&" { LAND(get_range lexbuf) }
| "||" { LOR(get_range lexbuf) }
| ('#' +) { DOWNS(String.length (Lexing.lexeme lexbuf), get_range lexbuf) }
| (digit +) { INTCONST(Lexing.lexeme lexbuf, get_range lexbuf) }
| ("@" identifier) { PVAR(Lexing.lexeme lexbuf, get_range lexbuf) }
| identifier {
let rng = get_range lexbuf in
let tok = Lexing.lexeme lexbuf in
match tok with
| "let" -> LET(rng)
| "in" -> IN(rng)
| "letrec" -> LETREC(rng)
| "fix" -> FIX(rng)
| "if" -> IF(rng)
| "then" -> THEN(rng)
| "else" -> ELSE(rng)
| "true" -> TRUE(rng)
| "false" -> FALSE(rng)
| "next" -> NEXT(rng)
| "prev" -> PREV(rng)
| "box" -> BOX(rng)
| "unbox" -> UNBOX(rng)
| _ -> OVAR(tok, rng)
}
| eof { EOI }
| _ as c { raise (Error("illegal token '" ^ (String.make 1 c) ^ "'")) }