blob: cbfc8dc0a768202a6b749e9ca10e52ef3087e27c (
plain)
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
|
{
open Expression_parser
module Expression = ImportExpression.T
exception UnclosedQuote of { content: string ; line : int}
}
let spaces = [ ' ' '\t' ]
let letters = [^ '"' '\'' '(' ')' '[' ']' ':' '.' ',' '^' ' ' '\t' '\n' '\r' ]
let digit = [ '0'-'9' ]
let eol = [ '\r' '\n' ]
let escaped = [ '\'' '\\']
rule token = parse
| eol { Lexing.new_line lexbuf; token lexbuf }
| spaces { token lexbuf }
| '\'' {
try read_quoted_string (Buffer.create 17) lexbuf
with Failure _ ->
let line = lexbuf.Lexing.lex_curr_p.pos_lnum
and content = Bytes.to_string lexbuf.Lexing.lex_buffer in
raise (UnclosedQuote {line; content})
}
| '"' { read_dquoted_string (Buffer.create 17) lexbuf }
| '#' { skip_comment lexbuf }
| '(' { L_PAREN }
| ')' { R_PAREN }
| '[' { L_BRACKET }
| ']' { R_BRACKET }
| ':' { COLUMN }
| '.' { DOT }
| ',' { COMA }
| '^' { CONCAT_OPERATOR }
| '+' { BINARY_OPERATOR (Expression.Add) }
| '-' { BINARY_OPERATOR (Expression.Minus) }
| '/' { BINARY_OPERATOR (Expression.Division) }
| "and" { BOOL_OPERATOR (Expression.And) }
| "or" { BOOL_OPERATOR (Expression.Or) }
| '<' { INEQUALITY_OPERATOR (Expression.LT) }
| '>' { INEQUALITY_OPERATOR (Expression.GT) }
| "<>" { EQUALITY_OPERATOR (Expression.Different) }
| '=' { EQUALITY_OPERATOR (Expression.Equal) }
| digit+ as l { INTEGER l}
| '-' digit+ as l { INTEGER l}
| letters+ as l { IDENT l}
| eof { EOF }
and skip_comment = parse
| [^ '\r' '\n' ]
{ skip_comment lexbuf }
| eol
{ token lexbuf }
(* Read the content until we got another one quote *)
and read_quoted_string buf = parse
| [^ '\'' '\\' ]+
{ Buffer.add_string buf (Lexing.lexeme lexbuf);
read_quoted_string buf lexbuf
}
| "\\\'"
{ Buffer.add_char buf '\'';
read_quoted_string buf lexbuf
}
| '\\'
{ Buffer.add_char buf '\\';
read_quoted_string buf lexbuf
}
| '\''
{ LITERAL (Buffer.contents buf)
}
(* Read the content until we got another one quote *)
and read_dquoted_string buf = parse
| [^ '"' '\\' ]+
{ Buffer.add_string buf (Lexing.lexeme lexbuf);
read_dquoted_string buf lexbuf
}
| "\\\""
{ Buffer.add_char buf '"';
read_dquoted_string buf lexbuf
}
| '\\'
{ Buffer.add_char buf '\\';
read_dquoted_string buf lexbuf
}
| '"'
{
LITERAL (Buffer.contents buf)
}
|