123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201(*********************************************************************************)(* OCaml-RDF *)(* *)(* Copyright (C) 2012-2021 Institut National de Recherche en Informatique *)(* et en Automatique. All rights reserved. *)(* *)(* This program is free software; you can redistribute it and/or modify *)(* it under the terms of the GNU Lesser General Public License version *)(* 3 as published by the Free Software Foundation. *)(* *)(* This program 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 this program; if not, write to the Free Software *)(* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA *)(* 02111-1307 USA *)(* *)(* Contact: Maxence.Guesdon@inria.fr *)(* *)(*********************************************************************************)(** *)openTtl_parser;;moduleL=Sedlexing.Utf8letreserved_chars=List.fold_rightTypes.CSet.add['~';'.';'-';'!';'$';'&';'\'';'(';')';'*';'+';',';';';'=';'/';'?';'#';'@';'%';'_']Types.CSet.empty;;(* FIXME: rewrite using Uutf.String.fold_utf_8 *)letpercent_escape_reserved_chars=letreciterblensi=ifi>=lenthen()elsebeginletsize=Utf8.utf8_nb_bytes_of_chars.[i]inletnext=matchsize,s.[i]with1,'\\'->ifi+size<len&&Types.CSet.mems.[i+size]reserved_charsthen(Printf.bprintfb"%%%02x"(Char.codes.[i+size]);i+size+1)else(Buffer.add_charbs.[i];i+size)|_->Buffer.add_stringb(String.subsisize);i+sizeiniterblensnextendinfuns->letlen=String.lengthsinletb=Buffer.createleniniterblens0;Buffer.contentsb;;letdigit=[%sedlex.regexp?'0'..'9']letalpha=[%sedlex.regexp?'a'..'z'|'A'..'Z']lethex=[%sedlex.regexp?digit|'A'..'F'|'a'..'f']letpn_chars_base=[%sedlex.regexp?alpha|0x00C0..0x00D6|0x00D8..0x00F6|0x00F8..0x02FF|0x0370..0x037D|0x037F..0x1FFF|0x200C..0x200D|0x2070..0x218F|0x2C00..0x2FEF|0x3001..0xD7FF|0xF900..0xFDCF|0xFDF0..0xFFFD|0x10000..0xEFFFF]letpn_chars_u=[%sedlex.regexp?pn_chars_base|'_']letpn_chars=[%sedlex.regexp?pn_chars_u|'-'|digit|0x00B7|0x0300..0x036F|0x203F..0x2040]letpn_prefix=[%sedlex.regexp?pn_chars_base,Opt(Star(pn_chars|'.'),pn_chars)]letpercent=[%sedlex.regexp?'%',hex,hex]letpn_local_sec=[%sedlex.regexp?'\\',('_'|'~'|'.'|'-'|'!'|'$'|'&'|"'"|'('|')'|'*'|'+'|','|';'|'='|'/'|'?'|'#'|'@'|'%')]letplx=[%sedlex.regexp?percent|pn_local_sec]letpn_local=[%sedlex.regexp?(pn_chars_u|':'|digit|plx),Opt(Star(pn_chars|'.'|':'|plx),(pn_chars|':'|plx))]letuchar=[%sedlex.regexp?("\\u",hex,hex,hex,hex)|("\\U",hex,hex,hex,hex,hex,hex,hex,hex)]letiriref=[%sedlex.regexp?'<',Star(Compl(0x00..0x20)|Chars("<>\\\"{}|^`")|uchar),'>']letpname_ns=[%sedlex.regexp?Opt(pn_prefix),':']letpname_ln=[%sedlex.regexp?pname_ns,pn_local]letblank_node_label=[%sedlex.regexp?"_:",(pn_chars_u|digit),Opt(Star(pn_chars|'.'),pn_chars)]letlangtag=[%sedlex.regexp?'@',Plus(alpha),Star('-',Plus(alpha|digit))]letinteger=[%sedlex.regexp?Opt('+'|'-'),Plus(digit)]letdecimal=[%sedlex.regexp?Opt('+'|'-'),Star(digit),'.',Plus(digit)]letexponent=[%sedlex.regexp?('e'|'E'),Opt('+'|'-'),Plus(digit)]letdouble=[%sedlex.regexp?Opt('+'|'-'),((Plus(digit),'.',Star(digit),exponent)|('.',Plus(digit),exponent)|Plus(digit),exponent)]letechar=[%sedlex.regexp?'\\',('t'|'b'|'n'|'r'|'f'|'\\'|'"'|'\\')]letstring_literal_quote=[%sedlex.regexp?'"',Star(Compl(0x22|0x5C|0xA|0xD)|echar|uchar),'"']letstring_literal_single_quote=[%sedlex.regexp?"'",Star(Compl(0x27|0x5C|0xA|0xD)|echar|uchar),"'"]letstring_literal_long_single_quote=[%sedlex.regexp?"'''",Star((Opt("'"|"''"),Compl('\''|'\\'))|echar|uchar),"'''"]letstring_literal_long_quote=[%sedlex.regexp?"\"\"\"",Star((Opt('"'|"\"\""),Compl('"'|'\\'))|echar|uchar),"\"\"\""]letws=[%sedlex.regexp?0x20|0x9|0xD|0xA]letanon=[%sedlex.regexp?'[',Star(ws),']']letcomment=[%sedlex.regexp?'#',Star(Compl(0xA|0xD))]letboolean=[%sedlex.regexp?"true"|"false"]letsparql_base=[%sedlex.regexp?('b'|'B'),('a'|'A'),('s'|'S'),('e'|'E')]letsparql_prefix=[%sedlex.regexp?('p'|'P'),('r'|'R'),('e'|'E'),('f'|'F'),('i'|'I'),('x'|'X')]letlexpos=Sedlex.updletrecmainposlexbuf=match%sedlexlexbufwith|'a'->lexposposlexbuf,A|"\r\n"->main(lexposposlexbuf)lexbuf|'\r'->main(lexposposlexbuf)lexbuf|'\n'->main(lexposposlexbuf)lexbuf|comment->main(lexposposlexbuf)lexbuf|ws->main(lexposposlexbuf)lexbuf|anon->(lexposposlexbuf),ANON|'('->(lexposposlexbuf),LEFT_PAR|')'->(lexposposlexbuf),RIGHT_PAR|'['->(lexposposlexbuf),LEFT_BRACKET|']'->(lexposposlexbuf),RIGHT_BRACKET|','->(lexposposlexbuf),COMMA|';'->(lexposposlexbuf),SEMICOLON|'.'->(lexposposlexbuf),DOT|"@prefix"->(lexposposlexbuf),AT_PREFIX|"@base"->(lexposposlexbuf),AT_BASE|sparql_prefix->(lexposposlexbuf),PREFIX|sparql_base->(lexposposlexbuf),BASE|langtag->lets=L.lexemelexbufinlets=String.subs1(String.lengths-1)in(lexposposlexbuf),At_identifiers|"^^"->(lexposposlexbuf),HATHAT|boolean->lets=L.lexemelexbufin(lexposposlexbuf),Booleans|integer->lets=L.lexemelexbufin(lexposposlexbuf),Integers|decimal->lets=L.lexemelexbufin(lexposposlexbuf),Decimals|double->lets=L.lexemelexbufin(lexposposlexbuf),Doubles|iriref->lets=L.lexemelexbufinletiri=String.subs1(String.lengths-2)inletiri=Utf8.utf8_unescape_to_percentiriin(lexposposlexbuf),Iriref_iri|pname_ns->lets=L.lexemelexbufin(*prerr_endline (Printf.sprintf "pname_ns %s" s);*)(lexposposlexbuf),Identifier(String.subs0(String.lengths-1))|blank_node_label->lets=L.lexemelexbufinletid=String.subs2(String.lengths-2)in(lexposposlexbuf),Bnameid|pname_ln->lets=L.lexemelexbufinletp=String.indexs':'inlets1=matchString.subs0pwith""->None|s->Somesinlets2=letlen=String.lengthsiniflen>p+1thenSome(percent_escape_reserved_chars(String.subs(p+1)(len-p-1)))elseNonein(lexposposlexbuf),Qname_(s1,s2)|string_literal_quote|string_literal_single_quote->lets=L.lexemelexbufinlets=String.subs1(String.lengths-2)in(lexposposlexbuf),String_(Utf8.utf8_unescapes)|string_literal_long_quote|string_literal_long_single_quote->lets=L.lexemelexbufinlets=String.subs3(String.lengths-6)inletpos=lexposposlexbufinpos,String_(Utf8.utf8_unescapes)|eof->(lexposposlexbuf),EOF|_->lets=L.lexemelexbufinletpos=lexposposlexbufinlete=Failure(Printf.sprintf"Lexeme %S not handled"s)inraise(Sedlex.Parse_error(e,pos));;