48 lines
965 B
OCaml
48 lines
965 B
OCaml
{
|
|
type token =
|
|
| Name of string
|
|
| String of string
|
|
| Minus
|
|
| Lparen
|
|
| Rparen
|
|
| Comma
|
|
| Equal
|
|
| Plus_equal
|
|
| Eof
|
|
|
|
let escaped_buf = Buffer.create 256
|
|
}
|
|
|
|
rule token = parse
|
|
| [' ' '\t' '\r']* { token lexbuf }
|
|
| '#' [^ '\n']* { token lexbuf }
|
|
| '\n' { Lexing.new_line lexbuf; token lexbuf }
|
|
|
|
| ['A'-'Z' 'a'-'z' '0'-'9' '_' '.']+ as s { Name s }
|
|
| '"'
|
|
{ Buffer.clear escaped_buf;
|
|
string escaped_buf lexbuf }
|
|
| '-' { Minus }
|
|
| '(' { Lparen }
|
|
| ')' { Rparen }
|
|
| ',' { Comma }
|
|
| '=' { Equal }
|
|
| "+=" { Plus_equal }
|
|
| eof { Eof }
|
|
| _ { Loc.fail_lex lexbuf "invalid character" }
|
|
|
|
and string buf = parse
|
|
| '"'
|
|
{ String (Buffer.contents buf) }
|
|
| "\\\n"
|
|
| '\n'
|
|
{ Lexing.new_line lexbuf;
|
|
Buffer.add_char buf '\n';
|
|
string buf lexbuf }
|
|
| '\\' (_ as c)
|
|
| (_ as c)
|
|
{ Buffer.add_char buf c;
|
|
string buf lexbuf }
|
|
| eof
|
|
{ Loc.fail_lex lexbuf "unterminated string" }
|