Movatterモバイル変換
[0]ホーム
\begin{code}moduleGHC.Read(Read(..),ReadS,lex,lexLitChar,readLitChar,lexDigits,lexP,paren,parens,list,choose,readListDefault,readListPrecDefault,readParen,readp)whereimportqualifiedText.ParserCombinators.ReadPasPimportText.ParserCombinators.ReadP(ReadP,ReadS,readP_to_S)importqualifiedText.Read.LexasLimportText.ParserCombinators.ReadPrecimportData.Maybe#ifndef __HADDOCK__importGHC.Unicode(isDigit)#endifimportGHC.NumimportGHC.RealimportGHC.Float()importGHC.ShowimportGHC.BaseimportGHC.ArrimportGHC.Generics(Arity(..),Associativity(..),Fixity(..))
\end{code}\begin{code}readParen::Bool->ReadSa->ReadSareadParenbg=ifbthenmandatoryelseoptionalwhereoptionalr=gr++mandatoryrmandatoryr=do("(",s)<-lexr(x,t)<-optionals(")",u)<-lextreturn(x,u)\end{code}%*********************************************************%* *\subsection{The @Read@ class}%* *%*********************************************************\begin{code}classReadawherereadsPrec::Int->ReadSareadList::ReadS[a]readPrec::ReadPrecareadListPrec::ReadPrec[a]readsPrec=readPrec_to_SreadPrecreadList=readPrec_to_S(listreadPrec)0readPrec=readS_to_PrecreadsPrecreadListPrec=readS_to_Prec(\_->readList)readListDefault::Reada=>ReadS[a]readListDefault=readPrec_to_SreadListPrec0readListPrecDefault::Reada=>ReadPrec[a]readListPrecDefault=listreadPreclex::ReadSStringlexs=readP_to_SL.hsLexslexLitChar::ReadSStringlexLitChar=readP_to_S(do{(s,_)<-P.gatherL.lexChar;returns})readLitChar::ReadSCharreadLitChar=readP_to_SL.lexCharlexDigits::ReadSStringlexDigits=readP_to_S(P.munch1isDigit)lexP::ReadPrecL.LexemelexP=liftL.lexparen::ReadPreca->ReadPrecaparenp=doL.Punc"("<-lexPx<-resetpL.Punc")"<-lexPreturnxparens::ReadPreca->ReadPrecaparensp=optionalwhereoptional=p+++mandatorymandatory=parenoptionallist::ReadPreca->ReadPrec[a]listreadx=parens(doL.Punc"["<-lexP(listRestFalse+++listNext))wherelistReststarted=doL.Puncc<-lexPcasecof"]"->return[]","|started->listNext_->pfaillistNext=dox<-resetreadxxs<-listRestTruereturn(x:xs)choose::[(String,ReadPreca)]->ReadPrecachoosesps=foldr((+++).try_one)pfailspswheretry_one(s,p)=do{token<-lexP;casetokenofL.Idents'|s==s'->pL.Symbols'|s==s'->p_other->pfail}\end{code}%*********************************************************%* *\subsection{Simple instances of Read}%* *%*********************************************************\begin{code}instanceReadCharwherereadPrec=parens(doL.Charc<-lexPreturnc)readListPrec=parens(doL.Strings<-lexPreturns+++readListPrecDefault)readList=readListDefaultinstanceReadBoolwherereadPrec=parens(doL.Idents<-lexPcasesof"True"->returnTrue"False"->returnFalse_->pfail)readListPrec=readListPrecDefaultreadList=readListDefaultinstanceReadOrderingwherereadPrec=parens(doL.Idents<-lexPcasesof"LT"->returnLT"EQ"->returnEQ"GT"->returnGT_->pfail)readListPrec=readListPrecDefaultreadList=readListDefault
\end{code}%*********************************************************%* *\subsection{Structure instances of Read: Maybe, List etc}%* *%*********************************************************For structured instances of Read we start using the precedences. Theidea is then that 'parens (prec k p)' will fail immediately when tryingto parse it in a context with a higher precedence level than k. But ifthere is one parenthesis parsed, then the required precedence leveldrops to 0 again, and parsing inside p may succeed.'appPrec' is just the precedence level of function application. So,if we are parsing function application, we'd better require theprecedence level to be at least 'appPrec'. Otherwise, we have to putparentheses around it.'step' is used to increase the precedence levels inside aparser, and can be used to express left- or right- associativity. Forexample, % is defined to be left associative, so we only increaseprecedence on the right hand side.Note how step is used in for example the Maybe parser to increase theprecedence beyond appPrec, so that basically only literals andparenthesis-like objects such as (...) and [...] can be an argument to'Just'.\begin{code}instanceReada=>Read(Maybea)wherereadPrec=parens(doL.Ident"Nothing"<-lexPreturnNothing+++precappPrec(doL.Ident"Just"<-lexPx<-stepreadPrecreturn(Justx)))readListPrec=readListPrecDefaultreadList=readListDefaultinstanceReada=>Read[a]wherereadPrec=readListPrecreadListPrec=readListPrecDefaultreadList=readListDefaultinstance(Ixa,Reada,Readb)=>Read(Arrayab)wherereadPrec=parens$precappPrec$doL.Ident"array"<-lexPtheBounds<-stepreadPrecvals<-stepreadPrecreturn(arraytheBoundsvals)readListPrec=readListPrecDefaultreadList=readListDefaultinstanceReadL.LexemewherereadPrec=lexPreadListPrec=readListPrecDefaultreadList=readListDefault
\end{code}%*********************************************************%* *\subsection{Numeric instances of Read}%* *%*********************************************************\begin{code}readNumber::Numa=>(L.Lexeme->ReadPreca)->ReadPrecareadNumberconvert=parens(dox<-lexPcasexofL.Symbol"-"->doy<-lexPn<-convertyreturn(negaten)_->convertx)convertInt::Numa=>L.Lexeme->ReadPrecaconvertInt(L.Inti)=return(fromIntegeri)convertInt_=pfailconvertFrac::Fractionala=>L.Lexeme->ReadPrecaconvertFrac(L.Inti)=return(fromIntegeri)convertFrac(L.Ratr)=return(fromRationalr)convertFrac_=pfailinstanceReadIntwherereadPrec=readNumberconvertIntreadListPrec=readListPrecDefaultreadList=readListDefaultinstanceReadIntegerwherereadPrec=readNumberconvertIntreadListPrec=readListPrecDefaultreadList=readListDefaultinstanceReadFloatwherereadPrec=readNumberconvertFracreadListPrec=readListPrecDefaultreadList=readListDefaultinstanceReadDoublewherereadPrec=readNumberconvertFracreadListPrec=readListPrecDefaultreadList=readListDefaultinstance(Integrala,Reada)=>Read(Ratioa)wherereadPrec=parens(precratioPrec(dox<-stepreadPrecL.Symbol"%"<-lexPy<-stepreadPrecreturn(x%y)))readListPrec=readListPrecDefaultreadList=readListDefault
\end{code}%*********************************************************%* * Tuple instances of Read, up to size 15%* *%*********************************************************\begin{code}instanceRead()wherereadPrec=parens(paren(return()))readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb)=>Read(a,b)wherereadPrec=wrap_tupread_tup2readListPrec=readListPrecDefaultreadList=readListDefaultwrap_tup::ReadPreca->ReadPrecawrap_tupp=parens(parenp)read_comma::ReadPrec()read_comma=do{L.Punc","<-lexP;return()}read_tup2::(Reada,Readb)=>ReadPrec(a,b)read_tup2=dox<-readPrecread_commay<-readPrecreturn(x,y)read_tup4::(Reada,Readb,Readc,Readd)=>ReadPrec(a,b,c,d)read_tup4=do(a,b)<-read_tup2read_comma(c,d)<-read_tup2return(a,b,c,d)read_tup8::(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh)=>ReadPrec(a,b,c,d,e,f,g,h)read_tup8=do(a,b,c,d)<-read_tup4read_comma(e,f,g,h)<-read_tup4return(a,b,c,d,e,f,g,h)instance(Reada,Readb,Readc)=>Read(a,b,c)wherereadPrec=wrap_tup(do{(a,b)<-read_tup2;read_comma;c<-readPrec;return(a,b,c)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd)=>Read(a,b,c,d)wherereadPrec=wrap_tupread_tup4readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade)=>Read(a,b,c,d,e)wherereadPrec=wrap_tup(do{(a,b,c,d)<-read_tup4;read_comma;e<-readPrec;return(a,b,c,d,e)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf)=>Read(a,b,c,d,e,f)wherereadPrec=wrap_tup(do{(a,b,c,d)<-read_tup4;read_comma;(e,f)<-read_tup2;return(a,b,c,d,e,f)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg)=>Read(a,b,c,d,e,f,g)wherereadPrec=wrap_tup(do{(a,b,c,d)<-read_tup4;read_comma;(e,f)<-read_tup2;read_comma;g<-readPrec;return(a,b,c,d,e,f,g)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh)=>Read(a,b,c,d,e,f,g,h)wherereadPrec=wrap_tupread_tup8readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh,Readi)=>Read(a,b,c,d,e,f,g,h,i)wherereadPrec=wrap_tup(do{(a,b,c,d,e,f,g,h)<-read_tup8;read_comma;i<-readPrec;return(a,b,c,d,e,f,g,h,i)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh,Readi,Readj)=>Read(a,b,c,d,e,f,g,h,i,j)wherereadPrec=wrap_tup(do{(a,b,c,d,e,f,g,h)<-read_tup8;read_comma;(i,j)<-read_tup2;return(a,b,c,d,e,f,g,h,i,j)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh,Readi,Readj,Readk)=>Read(a,b,c,d,e,f,g,h,i,j,k)wherereadPrec=wrap_tup(do{(a,b,c,d,e,f,g,h)<-read_tup8;read_comma;(i,j)<-read_tup2;read_comma;k<-readPrec;return(a,b,c,d,e,f,g,h,i,j,k)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh,Readi,Readj,Readk,Readl)=>Read(a,b,c,d,e,f,g,h,i,j,k,l)wherereadPrec=wrap_tup(do{(a,b,c,d,e,f,g,h)<-read_tup8;read_comma;(i,j,k,l)<-read_tup4;return(a,b,c,d,e,f,g,h,i,j,k,l)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh,Readi,Readj,Readk,Readl,Readm)=>Read(a,b,c,d,e,f,g,h,i,j,k,l,m)wherereadPrec=wrap_tup(do{(a,b,c,d,e,f,g,h)<-read_tup8;read_comma;(i,j,k,l)<-read_tup4;read_comma;m<-readPrec;return(a,b,c,d,e,f,g,h,i,j,k,l,m)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh,Readi,Readj,Readk,Readl,Readm,Readn)=>Read(a,b,c,d,e,f,g,h,i,j,k,l,m,n)wherereadPrec=wrap_tup(do{(a,b,c,d,e,f,g,h)<-read_tup8;read_comma;(i,j,k,l)<-read_tup4;read_comma;(m,n)<-read_tup2;return(a,b,c,d,e,f,g,h,i,j,k,l,m,n)})readListPrec=readListPrecDefaultreadList=readListDefaultinstance(Reada,Readb,Readc,Readd,Reade,Readf,Readg,Readh,Readi,Readj,Readk,Readl,Readm,Readn,Reado)=>Read(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)wherereadPrec=wrap_tup(do{(a,b,c,d,e,f,g,h)<-read_tup8;read_comma;(i,j,k,l)<-read_tup4;read_comma;(m,n)<-read_tup2;read_comma;o<-readPrec;return(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)})readListPrec=readListPrecDefaultreadList=readListDefault\end{code}\begin{code}readp::Reada=>ReadPareadp=readPrec_to_PreadPrecminPrec
\end{code}Instances for types of the generic deriving mechanism.\begin{code}derivinginstanceReadArityderivinginstanceReadAssociativityderivinginstanceReadFixity
\end{code}
[8]ページ先頭