-
Notifications
You must be signed in to change notification settings - Fork 0
/
lexer.mll
114 lines (93 loc) · 2.7 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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
{
open Lexing
open Parser
exception Error of string
let next_line lexbuf =
let pos = lexbuf.lex_curr_p in
lexbuf.lex_curr_p <- {
pos with pos_bol = lexbuf.lex_curr_pos;
pos_lnum = pos.pos_lnum + 1
}
}
let whitespace = [' ' '\t']
let newline = '\n' | '\r' | "\r\n"
let integer = '-'?['0'-'9']['0'-'9']*
let identifier = ['a'-'z']['a'-'z' 'A'-'Z' '0'-'9' '_']*
let bident = ['A'-'Z']['a'-'z' 'A'-'Z' '0'-'9' '_']*
let sharpid = '#'['a'-'z']['a'-'z' 'A'-'Z' '0'-'9' '_']*
rule read = parse
| ([^'\n']* '\n') as line
{ let n = String.length line in
let l = String.sub line 0 (n-1) in
Some l, true }
| eof
{ None, false }
| ([^'\n']+ as line) eof
{ Some (line ), false }
and token = parse
| whitespace {token lexbuf}
| integer as i {INT (int_of_string i)}
(* | "(*" { line_comment "" lexbuf } *)
| '{' { LBRACE }
| '}' { RBRACE }
| '(' { LPAREN }
| ')' { RPAREN }
| ',' { COMMA }
| '+' { ADD }
| '-' { SUB }
| '*' { MUL }
| '/' { DIV }
| '%' { MOD }
| ":" { COLON }
| "->" { ARROW }
| "||" { OR }
| "&&" { AND }
| "==" { BEQ }
| "!=" { NOTEQUAL }
| '=' { EQ}
| '<' { LT }
| '>' { GT }
| "<=" { LE }
| ">=" { GE }
| "." {DOT}
| "match" { MATCH }
| "with" { WITH }
| "|" { BAR }
| "let" { LET }
| "in" {IN}
| "if" { IF }
| "then" { THEN }
| "else" { ELSE }
| "val" { VAL }
| "fun" { FUN }
| "true" { TRUE true}
| "false" { FALSE false}
| "module" {MODULE}
| "open" {OPEN}
| "type" {TYPE}
(* Wys identifier *)
| "as_sec" {ASSEC}
| "as_par" {ASPAR}
| "box" {BOX}
| "mkwire_s" | "mkwire_p" {MKWIRE}
| "projwire_s" {PROJWIRE}
| "projwire_p" {PROJWIRE}
| "unbox_s" | "unbox_p" {UNBOX}
| "concat_wire" {CONCATWIRE}
| "wire" {WIRE}
| "singleton" {SINGLETON}
| "union" {UNION}
| "Alice" {ALICE}
| "Bob" {BOB}
| identifier { IDENT (lexeme lexbuf) }
| bident { STRING (lexeme lexbuf)}
| sharpid { IDENT (lexeme lexbuf)}
| "_" {ANY}
| eof { EOF }
| _ { raise (Error (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf)))}
(*
and line_comment buf = parse
| newline { next_line lexbuf ; line_comment buf lexbuf}
| "*)" { read lexbuf }
| _ { line_comment (buf ^ lexeme lexbuf) lexbuf }
*)