(* $Id: fl_meta.mll 85 2006-01-01 19:04:38Z gerd $
* ----------------------------------------------------------------------
*
*)
{ open Fl_metatoken }
rule token =
parse [ 'A'-'Z' 'a'-'z' '_' '0'-'9' '.' ]+
{
Name (Lexing.lexeme lexbuf)
}
| '('
{
LParen
}
| ')'
{
RParen
}
| "+="
{
PlusEqual
}
| '='
{
Equal
}
| '-'
{
Minus
}
| ','
{
Comma
}
| '"' [^ '"' '\\' ]* ( ( "\\\\" | "\\\"" ) [^ '"' '\\' ]* )* '"'
{
let s1 = Lexing.lexeme lexbuf in
let s2 = String.sub s1 1 (String.length s1 - 2) in
let l2 = String.length s2 in
let rec count i n =
if i<l2 then
match s2.[i] with
'\\' -> count (i+2) (n+1)
| _ -> count (i+1) (n+1)
else
n
in
let s3 = String.create (count 0 0) in
let rec fill i n =
if i<l2 then
match s2.[i] with
'\\' -> s3.[n] <- s2.[i+1]; fill (i+2) (n+1)
| c -> s3.[n] <- c; fill (i+1) (n+1)
else
()
in
fill 0 0;
String s3
}
| [ ' ' '\t' '\r' ]
{
Space
}
| '\n'
{
Newline
}
| '#' [^ '\n']* '\n'
{
Newline
}
| '#' [^ '\n']* eof
{
Eof
}
| eof
{
Eof
}
| _
{
Unknown
}
{}