(* Seemingly adequate lexer for the files in /usr/lib/menu *) { (* type libmenutoken = Package | Lparen | Rparen | Colon | Equals | String of string | Token of string *) open Libmenuparser let token_to_string token = match token with Package -> "Package" | Lparen -> "Lparen" | Rparen -> "Rparen" | Colon -> "Colon" | Equals -> "Equals" | String s -> ("String: \"" ^ s ^ "\"") | Token s -> ("Token: \"" ^ s ^ "\"") | Eof -> "Eof" } rule item = parse "?package" {Package} | '(' {Lparen} | ')' {Rparen} | ':' {Colon} | '=' {Equals} | '"' ( [ ^ '"'] | ( '\\' '"' ) ) * '"' {let s = Lexing.lexeme lexbuf in let l = String.length s in String (String.sub s 1 (l-2))} | ([ ' ' '\t' '\n' ]* '\\' '\n')* [ ' ' '\t' '\n' ]+ {item lexbuf} | [ ' ' '\t' '\n' ]+ ('\\' '\n' [ ' ' '\t' '\n' ]*)* {item lexbuf} | [ ' ' '\t' '\n' ]* ([ ' ' '\t' '\n' ]* '\\' '\n')+ {item lexbuf} | [ ' ' '\t' ]* '#' [ ^ '\n' ] * '\n' {item lexbuf} | [ ^ '(' ')' ':' '=' '"' '\n' '\t' ' ' '\\' ]+ {Token (Lexing.lexeme lexbuf)} | eof {Eof}