{ 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) }