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
|
|
|
|
| '\\' -> Buffer.add_char s.[i + 1]; loop (i + 2)
|
|
|
|
| _ -> Buffer.add_char s.[i ]; loop (i + 1)
|
|
|
|
in
|
|
|
|
String (loop 0) }
|
|
|
|
| '-' { Minus }
|
|
|
|
| '(' { Lparen }
|
|
|
|
| ')' { Rparen }
|
|
|
|
| ',' { Comma }
|
|
|
|
| '=' { Equal }
|
|
|
|
| "+=" { Plus_equal }
|
|
|
|
| eof { Eof }
|
|
|
|
| _ { lex_error lexbuf "invalid character" }
|