-
Notifications
You must be signed in to change notification settings - Fork 0
/
lexer.mll
66 lines (62 loc) · 2.49 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
(* Copyright 2018 Cyril Allignol
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License. *)
{
open Parser
exception SyntaxError of string
let reserved = [
"annotation"; "any"; "case"; "else"; "elseif"; "endif"; "enum"; "function";
"if"; "include"; "let"; "output"; "par"; "record"; "string"; "test";
"then"; "tuple"; "type"; "where" ]
let kwds = [
"array", ARRAY; "set", SET; "of", OF; "var", VAR;
"bool", BOOL; "false", BOOL_LIT false; "true", BOOL_LIT true;
"constraint", CONSTRAINT; "predicate", PREDICATE; "solve", SOLVE;
"float", FLOAT; "int", INT;
"satisfy", SATISFY; "maximize", MAXIMIZE; "minimize", MINIMIZE ]
let keyword_or_ident =
let keywords = Hashtbl.create 37 in
let () = List.iter (fun (kwd, tok) -> Hashtbl.add keywords kwd tok) kwds in
fun s -> match Hashtbl.find_opt keywords s with
| None -> if List.mem s reserved then failwith ("reserved: " ^ s)
else IDENTIFIER s
| Some token -> token
}
let digit = ['0'-'9']
let integer = ['-''+']? digit+
rule token = parse
| '%' [^'\n']* '\n' { Lexing.new_line lexbuf; token lexbuf }
| [' ''\t'] { token lexbuf }
| ['\r''\n'] { Lexing.new_line lexbuf; token lexbuf }
| eof { token lexbuf }
| ['A'-'Z''a'-'z']['A'-'Z''a'-'z''0'-'9''_']* as s { keyword_or_ident s }
| '_'*['A'-'Z''a'-'z']['A'-'Z''a'-'z''0'-'9''_']* as s { U_IDENTIFIER s }
| ',' { COMMA }
| ':' { COLON }
| ';' { SEMICOLON }
| '=' { EQ }
| ".." { DOUBLEDOT }
| "::" { DOUBLECOLON }
| '(' { LP }
| ')' { RP }
| '{' { LCB }
| '}' { RCB }
| '[' { LSB }
| ']' { RSB }
| integer as i { INT_LIT (int_of_string i) }
| '-'? "0x" ['0'-'9''A'-'F''a'-'f']+ as i { INT_LIT (int_of_string i) }
| '-'? "0o" ['0'-'7']+ as i { INT_LIT (int_of_string i) }
| integer '.' digit+ (['E''e'] integer)? as f { FLOAT_LIT (float_of_string f) }
| integer ['E''e'] integer as f { FLOAT_LIT (float_of_string f) }
| '"' [^'"''\n']* '"' as s { STRING_LIT s }
| _ { raise (SyntaxError ("Unexpected char: " ^ Lexing.lexeme lexbuf)) }