Blame compiler/pplex.mll

Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*                 MLTk, Tcl/Tk interface of OCaml                     *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*    Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis    *)
Packit bd2e5d
(*               projet Cristal, INRIA Rocquencourt                    *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                  *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(*  Copyright 2002 Institut National de Recherche en Informatique et   *)
Packit bd2e5d
(*  en Automatique and Kyoto University.  All rights reserved.         *)
Packit bd2e5d
(*  This file is distributed under the terms of the GNU Library        *)
Packit bd2e5d
(*  General Public License, with the special exception on linking      *)
Packit bd2e5d
(*  described in file ../../../LICENSE.                                *)
Packit bd2e5d
(*                                                                     *)
Packit bd2e5d
(***********************************************************************)
Packit bd2e5d
Packit bd2e5d
{
Packit bd2e5d
open Ppyac
Packit bd2e5d
exception Error of string
Packit bd2e5d
let linenum = ref 1
Packit bd2e5d
}
Packit bd2e5d
Packit bd2e5d
let blank = [' ' '\013' '\009' '\012']
Packit bd2e5d
let identchar =
Packit bd2e5d
  ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9']
Packit bd2e5d
let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_']
Packit bd2e5d
let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222']
Packit bd2e5d
Packit bd2e5d
rule token = parse
Packit bd2e5d
  blank + { token lexbuf }
Packit bd2e5d
| "##" [' ' '\t']* { directive lexbuf }
Packit bd2e5d
| ("#")? [^ '#' '\n']* '\n'? {
Packit bd2e5d
       begin
Packit bd2e5d
         let str = Lexing.lexeme lexbuf in
Packit bd2e5d
         if String.length str <> 0 && str.[String.length str - 1] = '\n' then
Packit bd2e5d
         begin
Packit bd2e5d
           incr linenum
Packit bd2e5d
         end;
Packit bd2e5d
         OTHER (str)
Packit bd2e5d
       end
Packit bd2e5d
    }
Packit bd2e5d
|  eof { EOF }
Packit bd2e5d
Packit bd2e5d
and directive = parse
Packit bd2e5d
| "ifdef" [' ' '\t']+  { IFDEF (ident lexbuf)}
Packit bd2e5d
| "ifndef" [' ' '\t']+  { IFNDEF (ident lexbuf)}
Packit bd2e5d
| "else"   { ELSE }
Packit bd2e5d
| "endif"  { ENDIF }
Packit bd2e5d
| "define" [' ' '\t']+* { DEFINE (ident lexbuf)}
Packit bd2e5d
| "undef"  [' ' '\t']+ { UNDEF (ident lexbuf)}
Packit bd2e5d
| _ { raise (Error (Printf.sprintf "unknown directive at line %d" !linenum))}
Packit bd2e5d
Packit bd2e5d
and ident = parse
Packit bd2e5d
| lowercase identchar* | uppercase identchar*
Packit bd2e5d
    { Lexing.lexeme lexbuf }
Packit bd2e5d
| _ { raise (Error (Printf.sprintf "illegal identifier at line %d" !linenum)) }