|
|
1.1 ! root 1: (* May 1989, Jussi Rintanen, Helsinki University of Technology *) ! 2: ! 3: functor MAKEmain (structure Parser : PARSER ! 4: and Automata : AUTOMATA ! 5: sharing Automata.Parser = Parser) ! 6: : sig val main : string -> unit end = ! 7: struct ! 8: ! 9: open Parser Automata ! 10: ! 11: val int2str : int -> string = makestring ! 12: ! 13: val accum = revfold ! 14: ! 15: fun count (a,nil) = 0 ! 16: | count (a,h::t) = (if a = h then 1 else 0) + count (a,t) ! 17: ! 18: fun member p = (count p) <> 0 ! 19: ! 20: (* Output *) ! 21: ! 22: fun labellist (Leaf (Label l)) = [l] ! 23: | labellist (Tree (_,cs)) = accum (fn (c,ac) => ac@(labellist c)) cs [] ! 24: | labellist _ = [] ! 25: ! 26: fun index (passed,nil) = [] ! 27: | index (passed,h::t) = ! 28: (if member (h,passed) orelse member (h,t) ! 29: then h^(int2str (count (h,passed) + 1)) ! 30: else h):: (index (h::passed,t)) ! 31: ! 32: fun emitlist' (e,nil) = () ! 33: | emitlist' (e,[a]) = e a ! 34: | emitlist' (e,h::t) = (e h;e",";emitlist' (e,t)) ! 35: ! 36: fun emitlist (e,l) = (e"[";emitlist'(e,l);e"]") ! 37: ! 38: fun emitcost (emit, rules, defaultcost) = ! 39: (emit "fun execute_cost (n:rule, ir, children) =\nlet open User\n"; ! 40: case defaultcost of ! 41: NoCost => () ! 42: | Cost code => (emit "val DC = ( "; app emit code; emit ") (map cost children)\n"); ! 43: emit "val ABORT = (fn () => raise MatchAbort)\n in\ncase n of\n "; ! 44: app (fn (Rule(n,_,_,p,Cost ss,_)) => ! 45: (emit (int2str n); ! 46: emit " => (case map cost children of "; ! 47: emitlist (emit, index ([],labellist p)); ! 48: emit " => ("; ! 49: app emit ss; ! 50: emit ") | _ => raise InternalError \"S4\")\n | ") ! 51: | (Rule(n,_,_,_,NoCost,_)) => (emit (int2str n);emit" => DC\n | ")) ! 52: rules; ! 53: emit "_ => raise InternalError \"S4.3.\"\nend\n\n") ! 54: ! 55: fun tokens (passed,h::t) = ! 56: let val suffix = ! 57: if member (h,passed) orelse member (h,t) ! 58: then (int2str (count (h,passed)+1)) ! 59: else "" ! 60: in ! 61: ("_"^h^" "^h^suffix, ! 62: "execute (nth(children,"^(int2str (length passed))^"))" ! 63: )::(tokens (h::passed,t)) ! 64: end ! 65: | tokens _ = [] ! 66: ! 67: fun reftokens ls = tokens ([],ls) ! 68: ! 69: fun DOtokens (passed,h::t) = ! 70: let val suffix = ! 71: if member (h,passed) orelse member (h,t) ! 72: then (int2str (count (h,passed)+1)) ! 73: else "" ! 74: in ! 75: ("DO"^h^suffix, ! 76: (* "let val C = nth(children,"^(int2str (length passed))^")in fn () => let val _"^h^" V = execute C in V end end" *) ! 77: "let val C = nth(children,"^(int2str (length passed))^")in fn () => case execute C of _"^h^" V => V | _ => raise InternalError \"S4.3\" end" ! 78: )::(DOtokens (h::passed,t)) ! 79: end ! 80: | DOtokens _ = [] ! 81: ! 82: fun DOreftokens ls = DOtokens ([],ls) ! 83: ! 84: fun emittuple'(e,nil) = () ! 85: | emittuple'(e,[a]) = e a ! 86: | emittuple'(e,h::t) = (e h;e",";emittuple'(e,t)) ! 87: ! 88: fun emittuple (e,t) = (e"(";emittuple'(e,t);e")") ! 89: ! 90: fun emitval (e,l) = ! 91: (emittuple (e,map (fn (_,a) => a) l); ! 92: e" of "; ! 93: emittuple (e,map (fn (a,_) => a) l)) ! 94: ! 95: fun emitaction (emit, rules) = ! 96: (emit "fun execute (Skeleton (n,_, ir, children)) =\n\ ! 97: \ let open User\n"; ! 98: emit "in\ncase n of\n"; ! 99: app (fn (Rule(n,t,Label l,p,_,Action ss)) => ! 100: let val labels = labellist p ! 101: in ! 102: emit (int2str n); ! 103: emit " => "; ! 104: (case t of ! 105: Ordinary => emit ("_"^l) ! 106: | Topdown => emit ("_"^l) ! 107: | Rewrite => emit "__rewrite"); ! 108: if labels <> nil ! 109: then (emit " ( case "; ! 110: (case t of ! 111: Ordinary => ! 112: emitval (emit,reftokens (labellist p)) ! 113: | Topdown => ! 114: emitval (emit,DOreftokens (labellist p)) ! 115: | Rewrite => emitval (emit,[("_","()")])); ! 116: emit " => ") ! 117: else (); ! 118: app emit ss; ! 119: if labels <> nil ! 120: then ! 121: case t of ! 122: Ordinary => emit " | _ => raise InternalError \"S5\" )" ! 123: | Topdown => emit" )" ! 124: | Rewrite => emit" )" ! 125: else (); ! 126: emit "\n | " ! 127: end | _ => ()) ! 128: rules; ! 129: emit "_ => raise Match\n"; ! 130: emit "end\n\n") ! 131: ! 132: fun emitrewrite (emit, rules) = ! 133: (emit "fun rewriterule (r:rule) =\n\ ! 134: \ case r of\n"; ! 135: app (fn (Rule(n,Rewrite,_,_,_,_)) => ! 136: (emit (int2str n); emit " => true |") | _ => ()) ! 137: rules; ! 138: emit "_ => false\n") ! 139: ! 140: (* Symbol datatype declaration *) ! 141: ! 142: fun symbol2str (Label s) = "__"^s ! 143: | symbol2str (Node (s,_)) = s ! 144: ! 145: fun emitsymbols (emit,symbols) = ! 146: let val maxarity = ! 147: accum ! 148: (fn (Node (_,a),max) => if a > max then a else max | (_,a) => a ) ! 149: symbols 0 ! 150: in ! 151: emit "ARC of int"; ! 152: map ! 153: (fn s => emit (" | "^(symbol2str s))) ! 154: symbols; ! 155: emit "\n" ! 156: end ! 157: ! 158: (* Unit match trees *) ! 159: ! 160: fun leafs (Leaf _) = 1 ! 161: | leafs (Tree(_,cs)) = fold (op +) (map leafs cs) 0 ! 162: ! 163: fun emitmatches (_,nil) = () ! 164: | emitmatches (emit, (Rule(n0,_,_,p,_,_)::rules)) = ! 165: (emit "val matchcounts = [\n"; ! 166: let val n = ! 167: (emit ("(" ^ (int2str n0) ^ "," ^ (int2str (leafs p)) ^ ")"); ! 168: accum ! 169: (fn (Rule(n,_,_,p,_,_),m) => ! 170: (emit (",\n(" ^ (int2str n) ^ "," ^ (int2str (leafs p)) ^ ")"); ! 171: if n > m then n else m)) ! 172: rules n0) ! 173: in ! 174: emit "]\nval matchtable = let val a = array("; ! 175: emit (int2str (n+1)); ! 176: emit ",0) in ((app (fn(r,m)=>update (a,r,m)) matchcounts); a) end\n\n\ ! 177: \fun matches r = matchtable sub r\n\n" ! 178: end) ! 179: ! 180: (* Unit rules *) ! 181: ! 182: datatype matchtree = Chain of int * symbol * matchtree list ! 183: ! 184: fun closurize unitrules = ! 185: let val rec member = ! 186: (fn (a,nil) => false | (a,h::t) => if a=h then true else member (a,t)) ! 187: val initials = ! 188: accum ! 189: (fn ((_,_,i),a) => if member (i,a) then a else i::a) ! 190: unitrules nil ! 191: fun build_unittree (nt,visited) = ! 192: accum (fn ((r,n,p),ac) => ! 193: if p = nt andalso not (member (n,visited)) ! 194: then Chain(r,n,build_unittree(n,n::visited))::ac ! 195: else ac) unitrules nil ! 196: in ! 197: map (fn i => (i,build_unittree (i,[i]))) initials ! 198: end ! 199: ! 200: fun emitmatchtreelist (emit,nil) = () ! 201: | emitmatchtreelist (emit,[m]) = emitmatchtree (emit, m) ! 202: | emitmatchtreelist (emit,(h::t)) = (emitmatchtree (emit,h); emit ","; emitmatchtreelist (emit,t)) ! 203: and emitmatchtree (emit, Chain (i, j, ml)) = ! 204: (emit "Chain ("; ! 205: emit (int2str i); ! 206: emit ","; ! 207: emit (symbol2str j); ! 208: emit ",["; ! 209: emitmatchtreelist (emit,ml); ! 210: emit "])") ! 211: ! 212: fun emitunitrules (emit, matchtrees,symbols) = ! 213: (emit "datatype matchtree = Chain of int * symbol * matchtree list\n"; ! 214: emit "fun unitmatches nt = (case nt of\n"; ! 215: app (fn (s,ms) => (emit (symbol2str s); ! 216: emit " => ["; ! 217: emitmatchtreelist (emit,ms); ! 218: emit "]\n | ")) ! 219: matchtrees; ! 220: emit "_ => [])\n\n") ! 221: ! 222: fun partition' (nil,u,n) = (u,n) ! 223: | partition' (Rule(r,_,l,Leaf s,_,_)::t,u,n) = partition' (t,(r,l,s)::u,n) ! 224: | partition' (r::t,u,n) = partition' (t,u,r::n) ! 225: ! 226: fun partition l = partition' (l,nil,nil) ! 227: ! 228: (* Main *) ! 229: ! 230: fun fatal s = output std_out ("Fatal error: "^s^"\n") ! 231: ! 232: fun main inputfilename = ! 233: let ! 234: val outputfilename = inputfilename ^ ".sml" ! 235: val (inputf, outputf) = (open_in inputfilename,open_out outputfilename) ! 236: val emit = output outputf ! 237: val (inserts, rules, dcost, structuren, label_type, symbols) = specification inputf ! 238: val (unitrules, otherrules) = partition rules ! 239: in ! 240: emit "structure "; ! 241: emit structuren; ! 242: emit " =\n\ ! 243: \struct\n\ ! 244: \ structure User =\n\ ! 245: \ struct\n\ ! 246: \datatype symbol =\n"; ! 247: emitsymbols (emit,symbols); ! 248: app (fn Prologue ss => (app emit ss) | Insert ss => (app emit ss)) inserts; ! 249: emit "\n\ndatatype result = __rewrite of tree | "; ! 250: emit label_type; ! 251: emit "\n end\n\n\ ! 252: \structure Specification =\n\ ! 253: \ struct\n\ ! 254: \structure User = User\n\nopen User\n\ ! 255: \type rule = int\n\ ! 256: \datatype skeletal = Skeleton of (rule * cost * tree * skeletal list)\n\ ! 257: \exception MatchAbort\n\ ! 258: \fun cost (Skeleton(_,c,_,_)) = c\n\ ! 259: \exception InternalError of string\n\n\ ! 260: \fun get_subtree (n,t) = nth (get_subtrees t,n-1)\n\n"; ! 261: emitcost (emit,rules,dcost); ! 262: emitaction (emit,rules); ! 263: emitmatches (emit, rules); ! 264: build_automaton (outputf,symbols,otherrules); ! 265: emitunitrules(emit, closurize unitrules,symbols); ! 266: emitrewrite (emit,rules); ! 267: emit "fun getreplacement (__rewrite t) = t | getreplacement _ = raise InternalError \"problem with rewrite 996\"\n\ ! 268: \ end\n\ ! 269: \structure Internal = MAKEtreeprocessor(Specification)\n\ ! 270: \exception NoCover = Internal.NoCover\n\ ! 271: \exception InternalError = Internal.InternalError\n\ ! 272: \val translate = Internal.translate\n\ ! 273: \end;\n"; ! 274: close_in inputf; ! 275: close_out outputf ! 276: end ! 277: handle ParserError s => fatal s ! 278: | AutomatonError s => fatal s ! 279: ! 280: end; ! 281: ! 282: structure Parser = MAKEparser(structure Symboltable = Symboltable ! 283: and Lexer = Lexer); ! 284: ! 285: structure Main = MAKEmain(structure Parser = Parser ! 286: and Automata = MAKEautomata(structure Parser = Parser));
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.