packages feed

liquid-fixpoint-0.1.0.0: external/ocamlgraph/src/dot_lexer.mll

(**************************************************************************)
(*                                                                        *)
(*  Ocamlgraph: a generic graph library for OCaml                         *)
(*  Copyright (C) 2004-2007                                               *)
(*  Sylvain Conchon, Jean-Christophe Filliatre and Julien Signoles        *)
(*                                                                        *)
(*  This software is free software; you can redistribute it and/or        *)
(*  modify it under the terms of the GNU Library General Public           *)
(*  License version 2, with the special exception on linking              *)
(*  described in file LICENSE.                                            *)
(*                                                                        *)
(*  This software is distributed in the hope that it will be useful,      *)
(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                  *)
(*                                                                        *)
(**************************************************************************)

(* $Id:$ *)

{
  open Lexing
  open Dot_ast
  open Dot_parser

  let string_buf = Buffer.create 1024

  let keyword =
    let h = Hashtbl.create 17 in
    List.iter 
      (fun (s,k) -> Hashtbl.add h s k)
      [
	"strict", STRICT;
	"graph", GRAPH;
	"digraph", DIGRAPH;
	"subgraph", SUBGRAPH;
	"node", NODE;
	"edge", EDGE;
      ];
    fun s -> let s = String.lowercase s in Hashtbl.find h s

}

let alpha = ['a'-'z' 'A'-'Z' '_']
let digit = ['0'-'9']
let ident = alpha (alpha | digit)*
let number = '-'? ('.'['0'-'9']+ | ['0'-'9']+('.'['0'-'9']*)? )

let space = [' ' '\t' '\r' '\n']+

rule token = parse
  | space
      { token lexbuf }
  | ('#' | "//") [^ '\n']* '\n'
      { token lexbuf }
  | "/*"
      { comment lexbuf; token lexbuf }
  | ":" 
      { COLON }
  | "," 
      { COMMA }
  | ";" 
      { SEMICOLON }
  | "=" 
      { EQUAL }
  | "{" 
      { LBRA }
  | "}" 
      { RBRA }
  | "[" 
      { LSQ }
  | "]" 
      { RSQ }
  | "--" | "->"
      { EDGEOP }
  | ident as s
      { try keyword s with Not_found -> ID (Ident s) }
  | number as s
      { ID (Number s) }
  | "\""
      { Buffer.clear string_buf; 
	let s = string lexbuf in
	ID (String s) }
  | "<"
      { Buffer.clear string_buf; 
	html lexbuf; 
	ID (Html (Buffer.contents string_buf)) }
  | eof
      { EOF }
  | _ as c
      { failwith ("Dot_lexer: invalid character " ^ String.make 1 c) }

and string = parse
  | "\"" 
      { Buffer.contents string_buf }
  | "\\" "\""
      { Buffer.add_char string_buf '"';
	string lexbuf }
  | _ as c
      { Buffer.add_char string_buf c;
	string lexbuf }
  | eof
      { failwith ("Dot_lexer: unterminated string literal") }

and html = parse
  | ">"
      { () }
  | "<"
      { Buffer.add_char string_buf '<'; html lexbuf;
	Buffer.add_char string_buf '>'; html lexbuf }
  | _ as c
      { Buffer.add_char string_buf c;
	html lexbuf }
  | eof
      { failwith ("Dot_lexer: unterminated html literal") }

and comment = parse
  | "*/"
      { () }
  | _ 
      { comment lexbuf }
  | eof
      { failwith "Dot_lexer: unterminated comment" }