-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlexer.mll
56 lines (52 loc) · 1.46 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
{
open Parser
open Lexing
exception Error of string
}
let digit = ['0'-'9']
let id = ['a'-'z'] ['a'-'z' '0'-'9']*
rule token = parse
| '\n' (* ignore newlines but count them *)
{ new_line lexbuf; token lexbuf }
| [' ' '\t'] (* ignore whitespaces and tabs *)
{ token lexbuf }
| '(' {LeftParenthesisToken}
| ')' {RightParenthesisToken}
| '=' {EqualToken}
| ":=" {AssignToken}
| "!=" {DifferentToken}
| '=' {EqualToken}
| ';' {SequenceToken}
| "ref" {RefToken}
| '!' {DerefToken}
| '<' {LesserToken}
| '>' {GreaterToken}
| "<=" {LesserEqualToken}
| ">=" {GreaterEqualToken}
| '+' {PlusToken}
| '-' {MinusToken}
| '*' {StarToken}
| '/' {SlashToken}
| "&&" {AndToken}
| "||" {OrToken}
| "->" {BodyToken}
| "fun" {FunctionToken}
| "if" {IfToken}
| "then" {ThenToken}
| "else" {ElseToken}
| "while" {WhileToken}
| "do" {DoToken}
| "done" {DoneToken}
| "let" {LetToken}
| "in" {InToken}
| "letrec" {RecToken}
| "true" {TrueToken}
| "false" {FalseToken }
| digit+ as inum
{NumberToken (int_of_string inum)}
| id as text
{IdentToken text}
| eof { EOF }
| _
{ raise (Error ("Unexpected char: "^(Lexing.lexeme lexbuf)^" at "^(string_of_int (Lexing.lexeme_start
lexbuf))^"-"^(string_of_int (Lexing.lexeme_end lexbuf)))) }