dune/src/meta_lexer.mll

40 lines
955 B
OCaml
Raw Normal View History

2016-11-13 10:01:32 +00:00
{
type token =
| Name of string
| String of string
| Minus
| Lparen
| Rparen
| Comma
| Equal
| Plus_equal
| Eof
}
2016-11-12 11:48:24 +00:00
rule token = parse
2016-11-13 10:01:32 +00:00
| [' ' '\t' '\r']* { token lexbuf }
| '#' [^ '\n']* { token lexbuf }
| '\n' { Lexing.new_line lexbuf; token lexbuf }
2016-11-12 11:48:24 +00:00
2016-11-13 10:01:32 +00:00
| ['A'-'Z' 'a'-'z' '0'-'9' '_' '.']+ as s { Name s }
| '"' ([^ '\\' '"']* ( '\\' ['\\' '"'] [^ '\\' '"']* )* as s) '"'
{ let len = String.length s in
let buf = Buffer.create len in
let rec loop i =
if i = len then
Buffer.contents buf
else
match s.[i] with
2016-11-13 11:27:31 +00:00
| '\\' -> Buffer.add_char buf s.[i + 1]; loop (i + 2)
| _ -> Buffer.add_char buf s.[i ]; loop (i + 1)
2016-11-13 10:01:32 +00:00
in
String (loop 0) }
| '-' { Minus }
| '(' { Lparen }
| ')' { Rparen }
| ',' { Comma }
| '=' { Equal }
| "+=" { Plus_equal }
| eof { Eof }
2016-11-13 11:13:47 +00:00
| _ { Loc.fail_lex lexbuf "invalid character" }