1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
|
(************************************************************************)
(* v * The Coq Proof Assistant / The Coq Development Team *)
(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(************************************************************************)
(*i $Id: coqdep_lexer.mll,v 1.6.6.1 2004/07/16 19:31:46 herbelin Exp $ i*)
{
open Filename
open Lexing
type mL_token = Use_module of string
type spec = bool
type coq_token =
| Require of spec * string list
| RequireString of spec * string
| Declare of string list
| Load of string
let comment_depth = ref 0
exception Fin_fichier
let module_name = ref []
let ml_module_name = ref ""
let specif = ref false
let mllist = ref ([] : string list)
let field_name s = String.sub s 1 (String.length s - 1)
}
let space = [' ' '\t' '\n' '\r']
let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255']
let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222']
let identchar =
['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9']
let coq_ident = ['a'-'z' '_' '0'-'9' 'A'-'Z']+
let coq_field = '.'['a'-'z' '_' '0'-'9' 'A'-'Z']+
let dot = '.' ( space+ | eof)
rule coq_action = parse
| "Require" space+
{ specif := false; opened_file lexbuf }
| "Require" space+ "Export" space+
{ specif := false; opened_file lexbuf}
| "Require" space+ "Syntax" space+
{ specif := false; opened_file lexbuf}
| "Require" space+ "Import" space+
{ specif := false; opened_file lexbuf}
| "Declare" space+ "ML" space+ "Module" space+
{ mllist := []; modules lexbuf}
| "Load" space+
{ load_file lexbuf }
| "\""
{ string lexbuf; coq_action lexbuf}
| "(*" (* "*)" *)
{ comment_depth := 1; comment lexbuf; coq_action lexbuf }
| eof
{ raise Fin_fichier}
| _
{ coq_action lexbuf }
and caml_action = parse
| [' ' '\010' '\013' '\009' '\012'] +
{ caml_action lexbuf }
| "open" [' ' '\010' '\013' '\009' '\012']*
{ caml_opened_file lexbuf }
| lowercase identchar*
{ caml_action lexbuf }
| uppercase identchar*
{ ml_module_name := Lexing.lexeme lexbuf;
qual_id lexbuf }
| ['0'-'9']+
| '0' ['x' 'X'] ['0'-'9' 'A'-'F' 'a'-'f']+
| '0' ['o' 'O'] ['0'-'7']+
| '0' ['b' 'B'] ['0'-'1']+
{ caml_action lexbuf }
| ['0'-'9']+ ('.' ['0'-'9']*)? (['e' 'E'] ['+' '-']? ['0'-'9']+)?
{ caml_action lexbuf }
| "\""
{ string lexbuf; caml_action lexbuf }
| "'" [^ '\\' '\''] "'"
{ caml_action lexbuf }
| "'" '\\' ['\\' '\'' 'n' 't' 'b' 'r'] "'"
{ caml_action lexbuf }
| "'" '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] "'"
{ caml_action lexbuf }
| "(*" (* "*)" *)
{ comment_depth := 1; comment lexbuf; caml_action lexbuf }
| "#" | "&" | "&&" | "'" | "(" | ")" | "*" | "," | "?" | "->" | "." | ".."
| ".(" | ".[" | ":" | "::" | ":=" | ";" | ";;" | "<-" | "=" | "[" | "[|"
| "[<" | "]" | "_" | "{" | "|" | "||" | "|]" | ">]" | "}" | "!=" | "-"
| "-." { caml_action lexbuf }
| ['!' '?' '~']
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~'] *
{ caml_action lexbuf }
| ['=' '<' '>' '@' '^' '|' '&' '$']
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~'] *
{ caml_action lexbuf }
| ['+' '-']
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~'] *
{ caml_action lexbuf }
| "**"
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~'] *
{ caml_action lexbuf }
| ['*' '/' '%']
['!' '$' '%' '&' '*' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~'] *
{ caml_action lexbuf }
| eof { raise Fin_fichier }
| _ { caml_action lexbuf }
and comment = parse
| "(*" (* "*)" *)
{ comment_depth := succ !comment_depth; comment lexbuf }
| "*)"
{ comment_depth := pred !comment_depth;
if !comment_depth > 0 then comment lexbuf }
| "'" [^ '\\' '\''] "'"
{ comment lexbuf }
| "'" '\\' ['\\' '\'' 'n' 't' 'b' 'r'] "'"
{ comment lexbuf }
| "'" '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] "'"
{ comment lexbuf }
| eof
{ raise Fin_fichier }
| _ { comment lexbuf }
and string = parse
| '"' (* '"' *)
{ () }
| '\\' ("\010" | "\013" | "\010\013") [' ' '\009'] *
{ string lexbuf }
| '\\' ['\\' '"' 'n' 't' 'b' 'r'] (*'"'*)
{ string lexbuf }
| '\\' ['0'-'9'] ['0'-'9'] ['0'-'9']
{ string lexbuf }
| eof
{ raise Fin_fichier }
| _
{ string lexbuf }
and load_file = parse
| '"' [^ '"']* '"' (*'"'*)
{ let s = lexeme lexbuf in
let f = String.sub s 1 (String.length s - 2) in
skip_to_dot lexbuf;
Load (if check_suffix f ".v" then chop_suffix f ".v" else f) }
| coq_ident
{ let s = lexeme lexbuf in skip_to_dot lexbuf; Load s }
| eof
{ raise Fin_fichier }
| _
{ load_file lexbuf }
and skip_to_dot = parse
| dot { () }
| eof { () }
| _ { skip_to_dot lexbuf }
and opened_file = parse
| "(*" (* "*)" *) { comment_depth := 1; comment lexbuf; opened_file lexbuf }
| space+
{ opened_file lexbuf }
| "Implementation"
{ opened_file lexbuf }
| "Specification"
{ specif := true; opened_file lexbuf }
| coq_ident
{ module_name := [Lexing.lexeme lexbuf];
opened_file_fields lexbuf }
| '"' [^'"']* '"' { (*'"'*)
let lex = Lexing.lexeme lexbuf in
let str = String.sub lex 1 (String.length lex - 2) in
let str =
if Filename.check_suffix str ".v" then
Filename.chop_suffix str ".v"
else str in
RequireString (!specif, str) }
| eof { raise Fin_fichier }
| _ { opened_file lexbuf }
and opened_file_fields = parse
| "(*" (* "*)" *)
{ comment_depth := 1; comment lexbuf;
opened_file_fields lexbuf }
| space+
{ opened_file_fields lexbuf }
| coq_field
{ module_name :=
field_name (Lexing.lexeme lexbuf) :: !module_name;
opened_file_fields lexbuf }
| dot { Require (!specif, List.rev !module_name) }
| eof { raise Fin_fichier }
| _ { opened_file_fields lexbuf }
and modules = parse
| space+ { modules lexbuf }
| "(*" (* "*)" *) { comment_depth := 1; comment lexbuf;
modules lexbuf }
| '"' [^'"']* '"'
{ let lex = (Lexing.lexeme lexbuf) in
let str = String.sub lex 1 (String.length lex - 2) in
mllist := str :: !mllist; modules lexbuf }
| _ { (Declare (List.rev !mllist)) }
and qual_id = parse
| '.' [^ '.' '(' '['] { Use_module (String.uncapitalize !ml_module_name) }
| eof { raise Fin_fichier }
| _ { caml_action lexbuf }
and caml_opened_file = parse
| uppercase identchar*
{ let lex = (Lexing.lexeme lexbuf) in
let str = String.sub lex 0 (String.length lex) in
(Use_module (String.uncapitalize str)) }
| eof {raise Fin_fichier }
| _ { caml_action lexbuf }
|