(* Copyright (C) 2000, HELM Team. * * This file is part of HELM, an Hypertextual, Electronic * Library of Mathematics, developed at the Computer Science * Department, University of Bologna, Italy. * * HELM is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * HELM 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. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HELM; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * * For details, see the HELM World-Wide-Web page, * http://cs.unibo.it/helm/. *) { open CicTextualParser;; module L = Lexing;; module U = UriManager;; let indtyuri_of_uri uri = let index_sharp = String.index uri '#' in let index_num = index_sharp + 3 in try (UriManager.uri_of_string (String.sub uri 0 index_sharp), int_of_string(String.sub uri index_num (String.length uri - index_num)) - 1 ) with Failure msg -> raise (CicTextualParser0.LexerFailure "Not an inductive URI") ;; let indconuri_of_uri uri = let index_sharp = String.index uri '#' in let index_div = String.rindex uri '/' in let index_con = index_div + 1 in try (UriManager.uri_of_string (String.sub uri 0 index_sharp), int_of_string (String.sub uri (index_sharp + 3) (index_div - index_sharp - 3)) - 1, int_of_string (String.sub uri index_con (String.length uri - index_con)) ) with Failure msg -> raise (CicTextualParser0.LexerFailure "Not a constructor URI") ;; } let num = ['1'-'9']['0'-'9']* | '0' let alfa = ['A'-'Z' 'a'-'z' '_' ''' '-'] let ident = alfa (alfa | num)* let baseuri = '/'(ident '/')* ident '.' let conuri = baseuri "con" let varuri = baseuri "var" let indtyuri = baseuri "ind#1/" num let indconuri = baseuri "ind#1/" num "/" num let blanks = [' ' '\t' '\n'] rule token = parse blanks { token lexbuf } (* skip blanks *) | "Case" { CASE } | "Fix" { FIX } | "CoFix" { COFIX } | "Set" { SET } | "Prop" { PROP } | "Type" { TYPE } | "CProp" { CPROP } | ident { ID (L.lexeme lexbuf) } | conuri { CONURI (U.uri_of_string ("cic:" ^ L.lexeme lexbuf)) } | varuri { VARURI (U.uri_of_string ("cic:" ^ L.lexeme lexbuf)) } | indtyuri { INDTYURI (indtyuri_of_uri ("cic:" ^ L.lexeme lexbuf)) } | indconuri { INDCONURI (indconuri_of_uri("cic:" ^ L.lexeme lexbuf)) } | num { NUM (int_of_string (L.lexeme lexbuf)) } | '?' num { let lexeme = L.lexeme lexbuf in META (int_of_string (String.sub lexeme 1 (String.length lexeme - 1))) } | ":>" { CAST } | ":=" { LETIN } | '?' { IMPLICIT } | '(' { LPAREN } | ')' { RPAREN } | '[' { LBRACKET } | ']' { RBRACKET } | '{' { LCURLY } | '}' { RCURLY } | ';' { SEMICOLON } | '\\' { LAMBDA } | '!' { PROD } | ':' { COLON } | '.' { DOT } | "->" { ARROW } | "_" { NONE } | eof { EOF } {}