itrm building functions used by parser > module Build_itrm where > import Char(isDigit)--1.3 > import Core_datatype > import Type_defs > import Attributes > import Unparse -- for debugging purposes only > import Kernel > import Sub_Core1 > import Sub_Core2 > import Sub_Core3 > import Sub_Core4 > import Vtslib rewrite for continuation based version of read? > sym' :: String -> String -> Flagged_ITrm > sym' str1 str2 > = if isint str1 && isint str2 > then Opnd ( Itrm ( Sym no1 no2 [] [sym_ind] )) > else Prs_Err ( errstr ++ " is not an integer " ) > where > no1 = read str1 > no2 = read str2 > isint = and . ( map isDigit ) > errstr = if isint str1 then str2 else str1 const' needs to be similar to above > const' :: String -> String -> String -> Flagged_ITrm > const' str1 str2 str3 > = Opnd ( Itrm ( Const no1 no2 no3 [] [sym_ind])) > where > no1 = read str1 > no2 = read str2 > no3 = read str3 > binder' bnd_con ( Opnd ( Idec dc )) ( Opnd ( Itrm tm )) > = ( Opnd . Itrm ) ( Binder bnd_con dc tm [] [pre_bdr] ) improve err mess > binder' _ ( Prs_Err x ) _ = Prs_Err x > binder' _ _ ( Prs_Err x ) = Prs_Err x > cond' :: Flagged_ITrm -> Flagged_ITrm -> Flagged_ITrm -> Flagged_ITrm > cond' ( Prs_Err x ) _ _ = Prs_Err x > cond' _ ( Prs_Err x ) _ = Prs_Err x > cond' _ _ ( Prs_Err x ) = Prs_Err x > cond' ( Opnd ( Idec dc ) ) ( Opnd ( Itrm tm1 ) ) ( Opnd ( Itrm tm2 )) > = Opnd ( Itrm ( Cond dc tm1 tm2 [] [] )) > let' ( Prs_Err x ) _ _ = Prs_Err x > let' _ ( Prs_Err x ) _ = Prs_Err x > let' _ _ ( Prs_Err x ) = Prs_Err x > let' ( Opnd ( Idec dc)) ( Opnd ( Itrm tm1)) ( Opnd ( Itrm tm2 )) > = opnd ( App ( Binder Lambda dc tm2 [] [] ) tm1 [] [let_stl] ) > let' ( Opr _ _ _ ) _ _ = error "1" > let' _ ( Opr _ _ _ ) _ = error "2" > let' _ _ ( Opr _ _ _ ) = error "3" > let' _ ( Opnd ( PApp _ _ _ )) _ = error "4.1" > let' _ ( Opnd ( PairApp _ ) ) _ = error "4.2" > let' _ ( Opnd ( ParIfx _ _) ) _ = error "4.3" > let' _ ( Opnd ( TypApp _ ) ) _ = error "4.4" > let' _ ( Opnd ( Itrm _ ) ) _ = error "4.5" > let' _ ( Opnd ( Idec _ ) ) _ = error "4.6" > let' _ ( Opnd _ ) _ = error "5" > let' _ _ ( Opnd _ ) = error "6" remove dummy application operators > app' ( Opr ( Spl "" ) _ _ ) x = x > app' x ( Opr ( Spl "" ) _ _ ) = x case analysis on special operators First case is for infix binders X -> etc ( prefix binders are dealt with by term' in parser ) infix binders x , -> etc > app' ( Opr ( OpBdr bdr ) _ _ ) ( Opnd ( Idec dc )) > = Opnd ( PApp bdr dc False ) > app' ( Opr ( OpBdr bdr ) _ _ ) ( Opnd ( Itrm srt )) > = Opnd ( PApp bdr dc True ) > where > dc = Symbol_dec srt [ sym_nm ( Name "_" ) ] > app' (Opnd ( PApp bdr dc anon )) ( Opnd ( Itrm tm )) > = opnd ( Binder bdr dc shft_tm [] [ifx_bdr] ) > where > shft_tm | anon = shift_trm [] 1 tm > | not anon = tm infix operators , /\. \/ etc > app' ( Opr ( OpIfx op ) _ _ ) ( Opnd ( Itrm tm )) > = Opnd ( ParIfx op tm ) > app' ( Opnd ( ParIfx op tm1 ) ) ( Opnd ( Itrm tm2 )) > = opnd ( Binary' op tm1 tm2 [] [] ) PairApp is , applied to first argument only > app' ( Opr ( Spl "," ) _ _ ) ( Opnd ( Itrm tm1 )) > = Opnd ( PairApp tm1 ) form pair when second argument found type set to U-1 to indicate it has not yet been defined. Will be defined explicitely by "typed" (see following clause) or will be deduced by `build_trm'' when proper term is constructed. > app' ( Opnd ( PairApp tm1 )) ( Opnd ( Itrm tm2 )) > = Opnd ( Itrm pairtm ) > where > pairtm = Pair tm1 tm2 pdt [] [pr_untyped] > pdt = Constant ( Univ (-1) ) [] [] TypApp is 'typed' applied to its first argument (does it need flagged_itrm as an argument in general?) > app' ( Opr ( Spl "typed" ) _ _ ) opnd1 > = Opnd ( TypApp opnd1 ) add other TypApp cases for other types (recurse ) (Note that pr_typed will replaced pr_untyped in attribute list) > app' ( Opnd ( TypApp ( Opnd ( Itrm ( Pair tm1 tm2 _ a b ))))) > ( Opnd ( Itrm srt )) > = Opnd ( Itrm ( Pair tm1 tm2 srt a [pr_typed] )) prefix not > app' ( Opr ( Spl "Not" ) _ _ ) ( Opnd ( Itrm tm )) > = opnd ( Unary Not tm [] [] ) ":" operator > app' ( Opr ( Spl ":" ) _ _ ) ( Opnd ( Itrm tm )) > = Opnd ( ParColon tm ) > app' ( Opnd ( ParColon tm1 )) ( Opnd ( Itrm tm2 )) > = opnd ( add_type tm1 tm2 ) four permutations for operators and operands > app' ( Opnd ( Itrm tm1 )) ( Opnd ( Itrm tm2 )) > = opnd ( App tm1 tm2 [] [] ) > app' ( Opr ( OpItrm op ) stl _ ) ( Opnd ( Itrm tm )) > = opnd ( App op tm [] [ op_stl stl ] ) > app' ( Opnd ( Itrm tm )) ( Opr ( OpItrm op ) _ _ ) -- happen? > = opnd ( App tm op [] [] ) ?what happens to style for second operator here? > app' ( Opr ( OpItrm op1 ) stl _ ) ( Opr ( OpItrm op2 ) _ _ ) > = opnd ( App op1 op2 [] [ op_stl stl ] ) > app' ( Prs_Err mess ) _ = Prs_Err mess > app' _ ( Prs_Err mess ) = Prs_Err mess > app' x y = error ( "app' y: " ++ unparse ( Empty []) y ++ "\nx: " ++ unparse (Empty [] ) x ) > opnd :: ITrm -> Flagged_ITrm > opnd = Opnd . Itrm include following as optimisation? > fetch_arg :: Flagged_ITrm -> ITrm > fetch_arg ( Opnd ( Itrm tm )) = tm > fetch_arg ( Opr ( OpItrm op ) _ _ ) = op > decpair' _ ( Prs_Err x ) _ = Prs_Err x > decpair' _ _ ( Prs_Err x ) = Prs_Err x > decpair' att ( Opnd ( Idec dc1 )) ( Opnd ( Idec dc2 )) > = ( Opnd . Idec ) ( Decpair dc1 dc2 att ) > symbol_dec' ( Opnd ( Itrm tm )) nm attL > = ( Opnd . Idec ) ( Symbol_dec tm ( sym_nm nm : attL ) ) > symbol_dec' ( Prs_Err mess ) nm _ = Prs_Err mess > data' ( _ , [ Prs_Err mesg ] ) _ > = Prs_Err mesg > data' ( type_nm , dcl ) ctr_defs > = case ctrs of > Ok ( ctr_nml , ctr_srtl ) > -> ( Opnd . Idec ) ( Data ( clear dcl ) ctr_srtl att ) > where > att = [ dat_nm ( type_nm : ctr_nml ) ] > Bad mesg -> Prs_Err mesg > where > ctrs = ctr' [] [] ctr_defs > clear ( Opnd ( Idec dc ) : dcl ) = dc : clear dcl > clear [] = [] > ctr' nml argll (( nm , argl ) : ctrl ) > = case checked_args of > Ok iargl -> ctr' ( nm : nml ) ( iargl : argll ) ctrl > Bad mesg -> Bad mesg > where > checked_args = check_arg [] argl > ctr' nml argll [] > = Ok ( reverse nml , reverse argll ) > check_arg tml ( Opnd ( Itrm tm ) : argl ) > = check_arg ( tm : tml ) argl > check_arg tml [] > = Ok ( reverse tml ) > check_arg _ ( Prs_Err mesg : argl ) > = Bad mesg > extend' ( Opnd ( Idec dc )) ( Opnd ( Isgn sg )) > = Opnd ( Isgn ( Extend dc sg [] )) > extend' _ ( Prs_Err mesg ) > = Prs_Err mesg > extend' ( Prs_Err mesg ) _ > = Prs_Err mesg > def' ( _ , [ Prs_Err mesg ] ) _ _ > = Prs_Err mesg > def' _ ( Prs_Err mesg ) _ > = Prs_Err mesg > def' ( nm , fmls ) ( Opnd ( Itrm rhs )) att > = ( Opnd . Idec ) ( Def tm srt [ sym_nm nm , att ] ) > where > tm = make_tm fmls rhs > srt = Constant ( Univ 0 ) [] [] -- temporary - need sort fn > make_tm ( Opnd ( Idec dc ) : dcl ) rhs > = Binder Lambda dc ( make_tm dcl rhs ) [] [] > make_tm [] rhs > = rhs > add_sg_att ( Prs_Err mesg ) _ = Prs_Err mesg > add_sg_att ( Opnd ( Isgn ( Empty attl ))) att > = Opnd ( Isgn ( Empty ( att : attl ))) > add_sg_att ( Opnd ( Isgn ( Extend dc sg attl ))) att > = Opnd ( Isgn ( Extend dc sg ( att : attl ))) > recurse' _ ( Prs_Err mesg ) = Prs_Err mesg > recurse' tml ( Opnd ( Itrm srt )) > = case clr [] tml of > Ok itml -> Opnd ( Itrm ( Recurse itml srt [] [rcrs_stl] )) > Bad mesg -> Prs_Err mesg > where > clr itml (( Opnd ( Itrm tm )) : tml ) = clr ( tm : itml ) tml > clr itml [] = Ok itml > clr _ ( Prs_Err mesg : _ ) = Bad mesg > tag' tg tgL > = case check tgL of > Ok _ -> Opnd ( Itrm ( Tagid tg tgL )) > Bad mesg -> Prs_Err mesg > where > check ( Tg_Trm ( TM _ _ _ ) : oth ) = check oth > check ( Tg_Trm ( TM_Err mesg ) :oth ) = Bad mesg > check ( Tg_Thm ( TH _ _ ) : oth ) = check oth > check ( Tg_Thm ( TH_Err mesg ) : oth ) = Bad mesg > check ( Tg_Int iL : oth ) = check oth > check [] = Ok [] -- list is given in tgL