|
|
1.1 root 1: (* ML-Yacc parser generator
2: This software is not subject to any ATT license.
3: This software comes with ABSOLUTELY NO WARRANTY;
4: you may copy and distribute this software;
5: see the STANDARD ML SOFTWARE LIBRARY GENERAL PUBLIC LICENSE AND WARRANTY
6: (in the file "LICENSE", distributed with this software, and available
7: from the above address) for details and restrictions.
8: *)
9: signature BASESET =
10: sig
11: type elem
12: type base_set
13: exception Select_arb
14: val empty: base_set
15: and insert: elem -> base_set -> base_set
16: and exists: elem -> base_set -> bool
17: and find: elem -> base_set -> elem option
18: and setfold: ((elem * 'b) -> 'b) -> base_set -> 'b -> 'b
19: and revsetfold: ((elem * 'b) -> 'b) -> base_set -> 'b -> 'b
20: and elem_gt: (elem * elem -> bool)
21: and elem_eq: (elem * elem -> bool)
22: and select_arb: base_set -> elem
23: and set_eq: (base_set * base_set) -> bool
24: and set_gt: (base_set * base_set) -> bool
25: and app : (elem -> 'a) -> base_set -> unit
26: end;
27:
28: signature FULLSET =
29: sig
30: type set
31: type elem
32: exception Select_arb
33: val card: set -> int
34: and app: (elem -> 'b) -> set -> unit
35: and set_eq: (set * set) -> bool
36: and set_gt: (set * set) -> bool
37: and find : elem -> set -> elem option
38: and exists: elem -> set -> bool
39: and contained: elem -> (set -> bool)
40: and difference: set * set -> set
41: and elem_eq: (elem * elem -> bool)
42: and elem_gt : (elem * elem -> bool)
43: and empty: set
44: and insert: elem -> set -> set
45: and is_empty: set -> bool
46: and make_list: set -> elem list
47: and make_set: (elem list -> set)
48: and remove: (elem * set) -> set
49: and same_set: set * set -> bool
50: and partition: (elem -> bool) -> (set -> set * set)
51: and revsetfold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b
52: and setfold: ((elem * 'b) -> 'b) -> set -> 'b -> 'b
53: and select_arb: set -> elem
54: and singleton: (elem -> set)
55: and union: set * set -> set
56: and closure: set * (elem -> set) -> set
57: end;
58:
59: signature GRAPH =
60: sig
61:
62: type node
63: type edge
64: type graph
65:
66: val null_graph: graph
67: val nodes_of: graph -> node list
68: val num_nodes: graph -> int
69: val join: graph * node * edge * node -> graph
70:
71: (* drt(9/12/88) - new functions added because join is inefficient,
72: if one or both of the nodes already exist *)
73:
74: val add_edge : graph * node * edge * node -> graph
75: val add_node : graph * node -> graph
76:
77: (* set of graph edges: records of {From:node, Edge:edge, To:node} *)
78:
79:
80: structure EdgeSet : FULLSET
81:
82: val edges: graph * node -> EdgeSet.set (* all edges from a node *)
83: val all_edges : graph -> EdgeSet.set
84:
85: val find_node : graph * node -> node option
86:
87: end;
88:
89: signature BUSY =
90: sig
91: val dot: unit -> unit
92: val star: unit -> unit
93: val print: string -> unit
94: val println: string -> unit
95:
96: val withSpace: ('a -> unit) -> ('a -> unit)
97: val withNewline: ('a -> unit) -> ('a -> unit)
98:
99: val withDot: ('a -> 'b) -> 'a -> 'b
100:
101: val sendto_list : unit -> unit
102: val sendto_file : outstream -> unit
103:
104: val get_list : unit -> string list
105: end;
106:
107: signature MEMO =
108: sig
109: type Arg
110:
111: val memo_fn: ((Arg * Arg) -> bool) -> ((Arg -> '2a) -> (Arg -> '2a))
112:
113: exception Enum_memo_fn
114:
115: val enum_memo_fn: ((Arg -> int) * int) -> ((Arg -> '2a) -> (Arg -> '2a))
116:
117: exception Catalog
118:
119: val catalog: {tag: Arg -> 'tag,
120: ordOfTag: 'tag -> int,
121: items: Arg list
122: } -> ('tag -> Arg list)
123: end;
124: signature V2_LR_GRAMMAR =
125: sig
126: datatype Terminal = T of int
127: and Nonterminal = NT of int
128:
129: datatype Symbol = TERM of Terminal
130: | NONTERM of Nonterminal
131:
132: datatype Attribute = ATTRIB of {lhs: Nonterminal,
133: rhsLength: int,
134: num : int
135: }
136:
137: datatype Rule = RULE of {lhs: Nonterminal,
138: rhs: Symbol list,
139: attribute: Attribute,
140: precedence: int option
141: }
142:
143: val termHash: Terminal -> int
144: val nontermHash: Nonterminal -> int
145:
146: val eqTerminal: Terminal * Terminal -> bool
147: val eqNonterminal: Nonterminal * Nonterminal -> bool
148:
149: val gtTerminal: Terminal * Terminal -> bool
150: val gtNonterminal: Nonterminal * Nonterminal -> bool
151: end;
152: signature V2_LSET =
153: sig
154: structure G : V2_LR_GRAMMAR
155: type Lookahead
156: val emptylookahead : Lookahead
157:
158: (* Sets the bool ref to true if lookahead arg 1
159: set - lookahead arg 2 set <> null, i.e. if merging the 2 lookahead
160: sets adds something to lookahead arg 1 set
161: *)
162:
163: val mergelookahead : ((Lookahead * Lookahead) * bool ref) -> Lookahead
164:
165: (* returns true if any terminal in the terminal list is not in
166: was not already in the lookahead set
167: *)
168:
169: val addterms: Lookahead * G.Terminal list -> Lookahead
170: val makelookaheadlist : Lookahead -> G.Terminal list
171: end
172:
173: signature V2_LR_UTILS =
174: sig
175: structure G: V2_LR_GRAMMAR
176: structure CoreSet : FULLSET
177: structure Lset : V2_LSET
178:
179: datatype Core = CORE of { I : {coreLHS: G.Nonterminal,
180: corePrecedence: int option,
181: coreAttribute: G.Attribute},
182: coreRHSbefore: G.Symbol list,
183: coreRHSafter: G.Symbol list,
184: prop: bool ref,
185: lookaheads : Lset. Lookahead ref
186: }
187:
188: sharing type CoreSet.elem = Core
189:
190: val eqSymbol: G.Symbol * G.Symbol -> bool
191: val gtSymbol: G.Symbol * G.Symbol -> bool
192:
193: val eqCore: Core * Core -> bool
194: val gtCore: Core * Core -> bool
195:
196: val mkshowSymbol: {showTerminalClass : G.Terminal -> string,
197: showNonterminal : G.Nonterminal -> string } ->
198: G.Symbol -> string
199:
200: val printCore: {showSymbol : G.Symbol -> string,
201: showNonterminal : G.Nonterminal -> string,
202: showTerminalClass : G.Terminal -> string} -> Core -> unit
203: val printCoreSet: {printCore : Core -> unit} -> CoreSet.set -> unit
204:
205: val mkselectCores: {rules : G.Rule list,
206: numNonterminals : int }
207: -> G.Nonterminal -> CoreSet.set
208: val mkcoreClosure: {rules : G.Rule list,
209: numNonterminals : int,
210: selectCores : G.Nonterminal -> CoreSet.set
211: } -> CoreSet.set -> CoreSet.set
212:
213: val immediateSymbols: CoreSet.set -> G.Symbol list
214: val copyCoreSet : CoreSet.set -> CoreSet.set
215:
216: type true
217: val prop_f_to_c_a :
218: {first_string : G.Symbol list -> G.Terminal list,
219: selectCores : G.Nonterminal -> CoreSet.set} ->
220: (CoreSet.set -> unit)
221: val propagate_l_to_c_a :
222: {selectCores : G.Nonterminal -> CoreSet.set } ->
223: (CoreSet.set * bool ref) -> unit
224: val propagate_l_to_g_i : (Core -> Core) ->
225: (((CoreSet.set * G.Symbol * CoreSet.set) *
226: bool ref) -> unit)
227: val set_prop : (G.Symbol list -> bool) -> (CoreSet.set -> unit)
228: val hardwire_eof : (CoreSet.set * G.Terminal * G.Nonterminal) -> unit
229: end;
230:
231: signature V2_LR_GRAPH =
232: sig
233: structure G: V2_LR_GRAMMAR
234: structure Lr_Graph : GRAPH
235: val mkGraph : {rules : G.Rule list, verbose : bool,
236: eof : G.Terminal, start : G.Nonterminal,
237: termPrecedence : G.Terminal -> int option,
238: showTerminalClass : G.Terminal -> string,
239: showTerminalValue : G.Terminal -> string,
240: showNonterminal : G.Nonterminal -> string,
241: showAttribute : G.Attribute -> string,
242: numTerminals : int,
243: numNonterminals : int
244: } -> Lr_Graph.graph
245: end;
246:
247: signature V2_LOOKAHEAD =
248: sig
249: structure G: V2_LR_GRAMMAR
250: structure Utils : V2_LR_UTILS
251: val mkfunctions : {numNonterminals:int,
252: selectCores : G.Nonterminal -> Utils.CoreSet.set,
253: showNonterminal : G.Nonterminal -> string,
254: showTerminalClass : G.Terminal -> string
255: } -> {nullable_string : G.Symbol list -> bool,
256: first_string : G.Symbol list -> G.Terminal list}
257: end;
258: signature V2_LR_TABLE =
259: sig
260: structure G: V2_LR_GRAMMAR
261: val mktable :
262: outstream ->
263: {rules : G.Rule list, verbose : bool,
264: eof : G.Terminal, start : G.Nonterminal,
265: termPrecedence : G.Terminal -> int option,
266: showTerminalClass : G.Terminal -> string,
267: showTerminalValue : G.Terminal -> string,
268: showNonterminal : G.Nonterminal -> string,
269: showAttribute : G.Attribute -> string,
270: numTerminals : int,
271: numNonterminals : int
272: } -> unit
273: end;
274: structure Busy: BUSY =
275: struct
276: val len = ref 0
277: val file = ref std_out (* file to send output *)
278: val list = ref (nil : string list) (* or list to save output on *)
279: val to_file = ref true (* true = to file, false = to_list *)
280:
281: val sendto_list = fn () => (to_file := false; list := nil)
282: val sendto_file = fn f => (file := f; to_file := true)
283: val get_list = fn () => (!list)
284:
285: val dots = ref false
286:
287: val P = fn x => if (!to_file) then output (!file) x
288: else list := x :: (!list)
289:
290: fun sym s = (if !len = 75 then (P "\n"; len := 0) else ();
291: flush_out (!file);
292: P s;
293: len := !len + 1;
294: dots := true
295: )
296:
297: fun dot() = sym "."
298: fun star() = sym "*"
299:
300: fun print s = (if !dots then (P "\n"; len := 0) else ();
301: dots := false;
302: P s;
303: len := !len + size s
304: );
305:
306: fun println s = (print s; P "\n"; len := 0)
307:
308: fun withSpace pr = fn x => (pr x; print " ")
309: fun withNewline pr = fn x => (pr x; println " ")
310:
311: fun withDot f a = f a before dot()
312: end;
313:
314: functor Memo(type Arg): MEMO =
315: struct
316: type Arg = Arg
317: type 'a relation = 'a * 'a -> bool
318:
319: fun memo_fn (Eq: Arg relation) (F: Arg -> '2a) =
320: let val MemoSet = (ref nil): (Arg * '2a) list ref
321: fun MemoCall(Arg, (X, Y) :: XYRest, Eq) =
322: if Eq(Arg, X) then Y else MemoCall(Arg, XYRest, Eq) |
323: MemoCall(Arg, nil, _) =
324: let val Y = F(Arg)
325: in (MemoSet := (Arg, Y) :: !MemoSet; Y)
326: end
327:
328: in fn X => MemoCall(X, !MemoSet, Eq)
329: end
330:
331: exception Enum_memo_fn
332: fun enum_memo_fn (Enum: Arg -> int, Max: int) (F: Arg -> '2a) =
333: let val MemoArray = array(Max, NONE): '2a option array
334: in fn x =>
335: let val n = Enum(x)
336: in case MemoArray sub n of
337: NONE => let val y = F(x)
338: in update(MemoArray, n, SOME(y)); y
339: end |
340: SOME(y) => y
341: end
342: handle Subscript => raise Enum_memo_fn
343: end
344:
345: (* catalog: given a function Tag for getting the selector tag
346: from any object, bundle the objects to give an efficient selector
347: function *)
348:
349: exception Catalog
350: fun catalog{tag, ordOfTag, items}: ('tag -> Arg list) =
351: let val OrdOfThing = ordOfTag o tag
352:
353: fun MaxOrdOfTag(Item :: IRest, Result): int =
354: (Busy.dot();
355: let val ThisOrd = OrdOfThing(Item)
356: in if ThisOrd > Result then MaxOrdOfTag(IRest, ThisOrd)
357: else MaxOrdOfTag(IRest, Result)
358: end
359: ) |
360: MaxOrdOfTag(nil, Result) = Result
361:
362: val MaxOrdOfTags =
363: (Busy.print "MaxOrdOfTags"; MaxOrdOfTag(items, 0))
364:
365: val TheCatalog =
366: array(MaxOrdOfTags + 1, NONE): Arg list option array
367:
368: fun InsertItem(Item) =
369: let val ord = OrdOfThing(Item)
370: in (case TheCatalog sub ord of
371: SOME(L) =>
372: update(TheCatalog, ord, SOME(Item :: L)) |
373:
374: NONE =>
375: update(TheCatalog, ord, SOME [Item])
376: ) before Busy.dot()
377: end
378:
379: val _ = (Busy.print "catalog"; map InsertItem items)
380:
381: in fn Tag => (case TheCatalog sub ordOfTag(Tag) of
382: SOME(L) => L |
383: NONE => raise Catalog
384: ) handle Subscript => raise Catalog
385: end
386: end;
387:
388: functor BaseSet(B : sig type elem
389: val gt : elem * elem -> bool
390: val eq : elem * elem -> bool
391: end ) : BASESET =
392:
393: struct
394:
395: type elem = B.elem
396: val elem_gt = B.gt
397: val elem_eq = B.eq
398:
399: datatype Color = RED | BLACK
400:
401: datatype base_set = EMPTY | TREE of (B.elem * Color * base_set * base_set)
402: exception Select_arb
403: val empty = EMPTY
404:
405: fun insert key t =
406: let fun f EMPTY = TREE(key,RED,EMPTY,EMPTY)
407: | f (TREE(k,BLACK,l,r)) =
408: if elem_gt (key,k)
409: then case f r
410: of r as TREE(rk,RED, rl as TREE(rlk,RED,rll,rlr),rr) =>
411: (case l
412: of TREE(lk,RED,ll,lr) =>
413: TREE(k,RED,TREE(lk,BLACK,ll,lr),
414: TREE(rk,BLACK,rl,rr))
415: | _ => TREE(rlk,BLACK,TREE(k,RED,l,rll),
416: TREE(rk,RED,rlr,rr)))
417: | r as TREE(rk,RED,rl, rr as TREE(rrk,RED,rrl,rrr)) =>
418: (case l
419: of TREE(lk,RED,ll,lr) =>
420: TREE(k,RED,TREE(lk,BLACK,ll,lr),
421: TREE(rk,BLACK,rl,rr))
422: | _ => TREE(rk,BLACK,TREE(k,RED,l,rl),rr))
423: | r => TREE(k,BLACK,l,r)
424: else if elem_gt(k,key)
425: then case f l
426: of l as TREE(lk,RED,ll, lr as TREE(lrk,RED,lrl,lrr)) =>
427: (case r
428: of TREE(rk,RED,rl,rr) =>
429: TREE(k,RED,TREE(lk,BLACK,ll,lr),
430: TREE(rk,BLACK,rl,rr))
431: | _ => TREE(lrk,BLACK,TREE(lk,RED,ll,lrl),
432: TREE(k,RED,lrr,r)))
433: | l as TREE(lk,RED, ll as TREE(llk,RED,lll,llr), lr) =>
434: (case r
435: of TREE(rk,RED,rl,rr) =>
436: TREE(k,RED,TREE(lk,BLACK,ll,lr),
437: TREE(rk,BLACK,rl,rr))
438: | _ => TREE(lk,BLACK,ll,TREE(k,RED,lr,r)))
439: | l => TREE(k,BLACK,l,r)
440: else TREE(key,BLACK,l,r)
441: | f (TREE(k,RED,l,r)) =
442: if elem_gt(key,k) then TREE(k,RED,l, f r)
443: else if elem_gt(k,key) then TREE(k,RED, f l, r)
444: else TREE(key,RED,l,r)
445: in case f t
446: of TREE(k,RED, l as TREE(_,RED,_,_), r) => TREE(k,BLACK,l,r)
447: | TREE(k,RED, l, r as TREE(_,RED,_,_)) => TREE(k,BLACK,l,r)
448: | t => t
449: end
450:
451: fun select_arb (TREE(k,_,l,r)) = k
452: | select_arb EMPTY = raise Select_arb
453:
454: fun exists key t =
455: let fun look EMPTY = false
456: | look (TREE(k,_,l,r)) =
457: if elem_gt(k,key) then look l
458: else if elem_gt(key,k) then look r
459: else true
460: in look t
461: end
462:
463: fun find key t =
464: let fun look EMPTY = NONE
465: | look (TREE(k,_,l,r)) =
466: if elem_gt(k,key) then look l
467: else if elem_gt(key,k) then look r
468: else SOME k
469: in look t
470: end
471:
472: fun revsetfold f t start =
473: let fun scan (EMPTY,value) = value
474: | scan (TREE(k,_,l,r),value) = scan(r,f(k,scan(l,value)))
475: in scan(t,start)
476: end
477:
478: fun setfold f t start =
479: let fun scan(EMPTY,value) = value
480: | scan(TREE(k,_,l,r),value) = scan(l,f(k,scan(r,value)))
481: in scan(t,start)
482: end
483:
484: fun app f t =
485: let fun scan EMPTY = ()
486: | scan(TREE(k,_,l,r)) = (scan l; f k; scan r)
487: in scan t
488: end
489:
490: (* equal_tree : test if two trees are equal. Two trees are equal if
491: the set of leaves are equal *)
492:
493: fun set_eq (tree1 as (TREE _),tree2 as (TREE _)) =
494: let datatype pos = L | R | M
495: exception Done
496: fun getvalue(stack as ((a,position)::b)) =
497: (case a
498: of (TREE(k,_,l,r)) =>
499: (case position
500: of L => getvalue ((l,L)::(a,M)::b)
501: | M => (k,case r of EMPTY => b | _ => (a,R)::b)
502: | R => getvalue ((r,L)::b)
503: )
504: | EMPTY => getvalue b
505: )
506: | getvalue(nil) = raise Done
507: fun f (nil,nil) = true
508: | f (s1 as (_ :: _),s2 as (_ :: _ )) =
509: let val (v1,news1) = getvalue s1
510: and (v2,news2) = getvalue s2
511: in (elem_eq(v1,v2)) andalso f(news1,news2)
512: end
513: | f _ = false
514: in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false
515: end
516: | set_eq (EMPTY,EMPTY) = true
517: | set_eq _ = false
518:
519: (* gt_tree : Test if tree1 is greater than tree 2 *)
520:
521: fun set_gt (tree1,tree2) =
522: let datatype pos = L | R | M
523: exception Done
524: fun getvalue(stack as ((a,position)::b)) =
525: (case a
526: of (TREE(k,_,l,r)) =>
527: (case position
528: of L => getvalue ((l,L)::(a,M)::b)
529: | M => (k,case r of EMPTY => b | _ => (a,R)::b)
530: | R => getvalue ((r,L)::b)
531: )
532: | EMPTY => getvalue b
533: )
534: | getvalue(nil) = raise Done
535: fun f (nil,nil) = false
536: | f (s1 as (_ :: _),s2 as (_ :: _ )) =
537: let val (v1,news1) = getvalue s1
538: and (v2,news2) = getvalue s2
539: in (elem_gt(v1,v2)) orelse (elem_eq(v1,v2) andalso f(news1,news2))
540: end
541: | f (_,nil) = true
542: | f (nil,_) = false
543: in f ((tree1,L)::nil,(tree2,L)::nil) handle Done => false
544: end
545: end
546:
547: functor FullSet (B : sig type elem
548: val eq : (elem*elem) -> bool
549: val gt : (elem*elem) -> bool
550: end
551: ) : FULLSET =
552: struct
553: structure C = BaseSet(B)
554: open C
555: type set = base_set
556:
557: fun is_empty(S) = (let val (_) = select_arb(S) in false end
558: handle Select_arb => true)
559:
560: fun make_list(S) = setfold (fn (a,r) => a::r) S nil
561:
562: val contained = exists
563:
564: fun make_set l =
565: List.fold (fn (a,NewSet) => insert a NewSet) l empty
566:
567: fun partition F S = setfold (fn (a,(Yes,No)) =>
568: if F(a) then (insert a Yes,No)
569: else (Yes,insert a No))
570: S (empty,empty)
571:
572: fun remove(X, XSet) =
573: let val (YSet, _) =
574: partition (fn a => not (elem_eq (X, a))) XSet
575: in YSet
576: end
577:
578: fun difference(Xs, Ys) =
579: setfold (fn (a,Xs') => if exists a Ys then Xs' else insert a Xs') Xs
580: empty
581:
582: fun singleton X = insert X empty
583:
584: fun card(S) = setfold (fn (a,count) => count+1) S 0
585:
586: val same_set = set_eq
587:
588: fun union(Xs,Ys)= setfold (fn (a,Xs) => insert a Xs) Ys Xs
589:
590: local
591: fun closure'(from, f, result) =
592: if is_empty from then result
593: else
594: let val (more,result) =
595: setfold (fn (a,(more',result')) =>
596: let val more = f a
597: val new = difference(more,result)
598: in (union(more',new),union(result',new))
599: end) from
600: (empty,result)
601: in closure'(more,f,result)
602: end
603: in
604: fun closure(start, f) = closure'(start, f, start)
605: end
606: end;
607:
608: functor Graph (B :
609: sig
610: type node
611: type edge
612: val eq_node : node * node -> bool
613: val gt_node : node * node -> bool
614: val eq_edge : edge * edge -> bool
615: val gt_edge : edge * edge -> bool
616: end
617: ) : GRAPH =
618: struct
619:
620: open B
621:
622: type graph_edge = {From : node, Edge : edge, To :node }
623:
624: fun EqEdge ({From=F1,Edge=E1, To = T1},{From=F2,Edge=E2,To=T2}) =
625: eq_node (F1,F2) andalso eq_node (T1,T2) andalso eq_edge(E1,E2)
626:
627: fun GtEdge ({From=F1,Edge=E1, To = T1},{From=F2,Edge=E2,To=T2}) =
628: gt_node(F1,F2) orelse (eq_node(F1,F2) andalso
629: (gt_node(T1,T2) orelse (eq_node(T1,T2) andalso gt_edge(E1,E2))))
630:
631: structure N = FullSet (struct
632: type elem = node
633: val eq = eq_node
634: val gt = gt_node
635: end
636: )
637:
638: structure EdgeSet = FullSet (struct
639: type elem = graph_edge
640: val eq = EqEdge
641: val gt= GtEdge
642: end
643: )
644:
645:
646: datatype graph = GRAPH of {TheNodes : N.set, TheEdges : EdgeSet.set}
647:
648: fun find_node (GRAPH {TheNodes, ...},n) = N.find n TheNodes
649:
650: val null_graph = GRAPH {TheNodes = N.empty, TheEdges = EdgeSet.empty}
651:
652: fun nodes_of(GRAPH{TheNodes, ...}) = N.make_list TheNodes
653:
654: fun num_nodes(GRAPH{TheNodes, ...}) = N.card(TheNodes)
655:
656: fun add_node (GRAPH {TheNodes, TheEdges} , n1) =
657: GRAPH{TheNodes=N.insert n1 TheNodes, TheEdges=TheEdges}
658:
659: fun add_edge (GRAPH {TheNodes, TheEdges}, n1, Edge, n2) =
660: let val NewEdges =
661: EdgeSet.insert {From=n1, Edge=Edge, To=n2} TheEdges
662: in GRAPH {TheNodes=TheNodes, TheEdges=NewEdges}
663: end
664:
665: fun join (GRAPH{TheNodes, TheEdges},n1, Edge, n2) =
666: GRAPH {TheNodes=N.insert n1 (N.insert n2 TheNodes),
667: TheEdges= EdgeSet.insert {From=n1,Edge=Edge,
668: To=n2} TheEdges }
669:
670: fun edges ( GRAPH {TheNodes, TheEdges }, n) =
671: let fun match {From, Edge,To} = eq_node (From, n)
672: in EdgeSet.setfold (fn (e,r) =>
673: if match e then EdgeSet.insert e r else r)
674: TheEdges EdgeSet.empty
675: end
676:
677: fun all_edges(GRAPH{TheEdges, ...}) = TheEdges
678:
679: end;
680: functor V2_Lset (G : V2_LR_GRAMMAR) : V2_LSET =
681: struct
682: open G
683: structure G = G
684: abstype Lookahead = LS of (G.Terminal*int) list
685: with val emptylookahead = LS nil
686:
687: (* mergelookahead - return true as the second element of the
688: pair if lookahead set 2 contains some elements lookahead
689: set 1 does not
690: *)
691:
692: fun mergelookahead (p,flag : bool ref) : Lookahead =
693: let fun f(nil,nil,r) = rev r
694: | f(a::a',nil,r) = f(a',nil,a::r)
695: | f(nil,b::b',r) = f(b',nil,b::r)
696: | f(x as ((a as (_,hash_a))::a'),
697: y as ((b as (_,hash_b))::b'),r) =
698: if ((hash_a : int ) < hash_b) then
699: f(a',y,a::r)
700: else if (hash_a>hash_b) then
701: f(x,b',b::r)
702: else f(a',b',a::r)
703: in case p of
704: (LS a,LS b) =>
705: let val r = f(a,b,nil)
706: in (if (length a) < (length r) then
707: flag := true
708: else (); LS r)
709: end
710: end
711:
712: (* addterms - adds terminals to a lookahead set *)
713:
714: fun addterms(LS a,l) =
715: let fun g(l,e) =
716: let val hash_e = termHash e
717: fun insert(nil,e) = [(e,hash_e)]
718: | insert(t as ((a' as (_,hash_a))::a),e) =
719: if (hash_a<hash_e) then a'::(insert(a,e))
720: else if (hash_a=hash_e) then t
721: else (e,hash_e)::a'::a
722: in insert(l,e)
723: end
724: val r=List.fold (fn (e,r) => g(r,e)) l a
725: in LS r
726: end
727:
728: fun makelookaheadlist (LS a) = List.map (fn (t,_) => t) a
729: end
730: end;
731:
732: functor V2_LrUtils(structure G : V2_LR_GRAMMAR): V2_LR_UTILS =
733: struct
734:
735: structure G = G
736: structure Lset = V2_Lset(G)
737: structure Memo = Memo(type Arg = G.Nonterminal)
738:
739: open G
740:
741: val DEBUG = false
742: val print = if DEBUG then output std_out
743: else Busy.print
744: val println = if DEBUG then fn x => (print x; print "\n")
745: else Busy.println
746: val withNewline = if DEBUG then (fn pr => fn x => (pr x; print "\n"))
747: else Busy.withNewline
748:
749: (* diagnostics *)
750: val mkshowSymbol =
751: fn {showTerminalClass = showTerminalClass : G.Terminal -> string,
752: showNonterminal = showNonterminal : G.Nonterminal -> string
753: } => fn (TERM t) => showTerminalClass t
754: | (NONTERM nt) => showNonterminal nt
755:
756: fun showSpaced f lst = fold (fn (x, y) => x ^ " " ^ y) (map f lst) ""
757:
758: datatype Core = CORE of { I : {coreLHS: G.Nonterminal,
759: corePrecedence: int option,
760: coreAttribute: G.Attribute},
761: coreRHSbefore: G.Symbol list,
762: coreRHSafter: G.Symbol list,
763: prop : bool ref,
764: lookaheads : Lset.Lookahead ref
765: }
766:
767:
768: val printCore =
769: fn {showSymbol=showSymbol: G.Symbol -> string,
770: showNonterminal=showNonterminal : G.Nonterminal -> string,
771: showTerminalClass=showTerminalClass : G.Terminal -> string } =>
772: fn (CORE c) =>
773: let val {I = {coreLHS=coreLHS, ...}, coreRHSbefore, coreRHSafter,
774: prop, lookaheads} = c
775: in (
776: print(showNonterminal coreLHS ^ " : "
777: ^ showSpaced showSymbol (rev coreRHSbefore)
778: ^ "_"
779: ^ showSpaced showSymbol coreRHSafter
780: );
781: if DEBUG then
782: print(" lookaheads: " ^ showSpaced showTerminalClass
783: (Lset.makelookaheadlist (!lookaheads))
784: )
785: else ()
786: )
787: end
788:
789: fun gtSymbol(TERM t1, TERM t2) = gtTerminal(t1,t2)
790: | gtSymbol(NONTERM nt1, NONTERM nt2) = gtNonterminal(nt1,nt2)
791: | gtSymbol (TERM _,NONTERM _) = true
792: | gtSymbol _ = false
793:
794: fun eqSymbol(TERM t1, TERM t2) = eqTerminal(t1,t2)
795: | eqSymbol(NONTERM nt1, NONTERM nt2) =eqNonterminal(nt1,nt2)
796: | eqSymbol _ = false
797:
798: fun eqCore(CORE {I = {coreAttribute = G.ATTRIB {num=n1,...}, ...},
799: coreRHSbefore=b1, ...},
800: CORE {I = {coreAttribute = G.ATTRIB {num=n2,...}, ...},
801: coreRHSbefore = b2, ...}
802: ) =
803: (n1 = n2) andalso (length b1 = length b2)
804:
805: fun gtCore(CORE {I = {coreAttribute = G.ATTRIB {num=n1,...}, ...},
806: coreRHSbefore=b1, ...},
807: CORE {I = {coreAttribute = G.ATTRIB {num=n2,...}, ...},
808: coreRHSbefore = b2, ...}
809: ) =
810: (n1>n2) orelse (n1=n2 andalso (length b1) > length (b2))
811:
812: structure CoreSet = FullSet (struct
813: type elem = Core
814: val gt = gtCore
815: val eq = eqCore
816: end)
817:
818: fun filter f (x :: xs) = if f x then x :: filter f xs else filter f xs
819: | filter f nil = nil
820:
821: fun buildCore(RULE{lhs, rhs, attribute, precedence}) =
822: CORE({I = {coreLHS=lhs,
823: corePrecedence=precedence,
824: coreAttribute=attribute},
825: coreRHSbefore=nil,
826: coreRHSafter=rhs,
827: prop=ref false,
828: lookaheads=ref Lset.emptylookahead
829: }
830: )
831:
832: fun copyCore(a as (CORE c)) =
833: case c
834: of {I,coreRHSbefore, coreRHSafter, ...} =>
835: CORE({I=I,
836: coreRHSbefore=coreRHSbefore,
837: coreRHSafter=coreRHSafter,
838: prop=ref false,
839: lookaheads = ref Lset.emptylookahead
840: })
841:
842: val copyCoreSet = fn s =>
843: CoreSet.setfold (fn (a,r)=> CoreSet.insert (copyCore a) r) s
844: CoreSet.empty
845:
846: val printCoreSet = fn {printCore = printCore : Core -> unit} =>
847: let val printCoreIndented = fn core =>
848: (print " "; withNewline printCore core)
849: in fn cores => CoreSet.app printCoreIndented cores
850: end
851:
852: val buildCores = fn rules => fn nt =>
853: let val matchingProds =
854: filter (fn RULE{lhs, ...} => eqNonterminal(lhs, nt))
855: rules
856:
857: val cores = CoreSet.make_set (map buildCore matchingProds)
858: in
859: (*
860: if DEBUG then
861: (println("buildCores " ^ showNonterminal nt);
862: printCoreSet cores
863: )
864: else
865: *) ();
866:
867: cores
868: end
869:
870: val mkselectCores =
871: fn {rules=rules : G.Rule list,numNonterminals=n : int} =>
872: (Memo.enum_memo_fn (G.nontermHash, n))
873: (buildCores rules)
874:
875: fun immediateSymbols cores =
876: CoreSet.setfold
877: (fn (CORE {coreRHSafter,...},result) =>
878: case coreRHSafter
879: of sym :: _ =>
880: if (exists (fn a => eqSymbol(a,sym)) result)
881: then result
882: else sym::result
883: | nil => result
884: ) cores nil
885:
886:
887: datatype true = T of Nonterminal | F
888:
889: (* Transitive closure : assumes array is an array of row arrays,
890: where entry a(i,j) is true if the ith item is connected to the
891: jth item, i.e. if the nonterminal with hash # i will cause all
892: the productions of the nonterminal with hash # j to be added to a
893: core set when
894: a production of the form 'a . B 'b, where hash B = i is
895: encountered *)
896:
897: val transitive_closure = fn (a : true array array) =>
898: let val size = Array.length a
899: val i = ref 0
900: val j = ref 0
901: val k = ref 0
902: in while (!i < size) do
903: (j := 0; while (!j < size) do
904:
905: (* check if jth nonterm derives ith nonterm *)
906:
907: (case ((a sub !j) sub !i) of
908: (T _) =>
909:
910: (* if so then connect jth nonterm w/ everything the
911: ith derives
912: *)
913: (k := 0;
914: while (!k < size) do
915: (case ((a sub !i) sub !k)
916: of (d as (T x)) => update(a sub !j,!k,d)
917: | _ => ();
918: if DEBUG then (
919: print ("doing " ^ (makestring (!i)) ^ " " ^
920: (makestring (!j)) ^ " " ^ (makestring (!k)) ^
921: "\n")
922: )
923: else ();
924: k := !k +1
925: )
926: )
927: | F => (); j := !j+1
928: );
929: i := !i + 1
930: )
931: end
932:
933: (* ComputeClosureAdditions - compute the nonterminals which must
934: be added when one nonterminal with a dot before it is added to
935: the core set. Do this by constructing an array indexed by
936: nonterminal hash #. Each a[i,j] entry is set to true when
937: nonterminal i derives nonterminal j. Then take the closure
938: of the array. (Clearly, if A -> .B, and B -> .C, then A -> .C,
939: also. *)
940:
941: fun ComputeClosureAdditions(rules,max) =
942: let val a = array(max,array(max,F)) (* re: same subarray, always *)
943: val _ = let val i = ref 0 (* re: make them different *)
944: in while (!i<max) do (* arrays *)
945: (update(a,!i,array(max,F)); i := !i + 1)
946: end
947: val g = fn (RULE {lhs,rhs=(NONTERM n)::_,...}) =>
948: update(a sub (nontermHash lhs),nontermHash n,T n)
949: | _ => ()
950: in (app g rules; transitive_closure(a); a)
951: end
952:
953: val ComputeClosureAdditions =
954: (*
955: if DEBUG then
956: fn (rules,max) =>
957: let val a = ComputeClosureAdditions(rules,max)
958: val i = ref 0
959: in (while (!i < max) do
960: (let val j = ref 0
961: in while (!j < max) do
962: (case ((a sub !i) sub !j) of
963: T i => print ((showNonterminal i) ^ " ")
964: | F => ();
965: j := !j+1)
966: end; println ""; i := !i+1
967: ); a)
968: end
969: else
970: *) ComputeClosureAdditions
971:
972: (* ComputeCoreSetClosure:
973:
974: Takes the closure of a core set. This consists of adding for
975: each item with a nonterminal immediately after the dot all
976: productions for which the nonterminal is the lhs. This process
977: is then repeated for the new production.
978:
979: We can compute the set of all nonterminals whose productions
980: must be added when a nonterminal is added using ComputeClosure-
981: Additions.
982:
983: We keep a boolean array indexed by nonterminal hash #'s. We look
984: at all the items in the core set. When we find an item with a non-
985: terminal immediately after the ., we set the corresponding element
986: in the bool array to true,s ince we must add all the productions for
987: that terminal. We also set the entries for all the nonterminals
988: which must be added when that nonterminal is added. This uses the
989: information from ComputeClosureAdditions.
990:
991: Note that we can check the entry for the nonterminal with the dot
992: before it before doing any of this. If it is true, since the
993: relation defined by ComputeClosureAdditions is transitive, all non-
994: terminals which would need to be added for this nonterminal have
995: already been added when it was added
996:
997: We then take the boolean array, and add all productions for
998: all nonterminals whose have been set to true.
999: *)
1000:
1001: fun ComputeCoreSetClosure(cores,a,max,selectCores) =
1002: (* cores = core set, a = array from ComputeClosureAdditions,
1003: max = # of nonterminals *)
1004:
1005: let val b = array(max,F)
1006: fun g (CORE c) =
1007: let val {coreRHSafter,...} = c
1008: in case coreRHSafter of
1009: ((NONTERM n) :: _) =>
1010: let val num = nontermHash n
1011: in case (b sub num) of
1012: F => (update(b,num,T n);
1013: let val i = ref 0
1014: in while (!i < max) do
1015: (case ((a sub num) sub !i)
1016: of F => ()
1017: | (m as (T _)) =>
1018: update(b,!i,m);
1019: i := !i + 1
1020: )
1021: end
1022: )
1023: | (T _ ) => ()
1024: end
1025: | _ => ()
1026: end
1027: fun add_cores(cores) =
1028: let fun g (i,cores) =
1029: case (b sub i) of
1030: (T k) => CoreSet.union(cores,
1031: (selectCores k))
1032: | F => cores
1033: fun f(i,r) =
1034: if (i < max) then f(i+1,g(i,r))
1035: else r
1036: in f(0,cores)
1037: end
1038: in ((CoreSet.app g cores); add_cores cores)
1039: end
1040:
1041: val mkcoreClosure=
1042: fn {rules=rules:G.Rule list,
1043: numNonterminals=numNonterminals:int,
1044: selectCores=selectCores:G.Nonterminal->CoreSet.set
1045: } =>
1046: let val a = ComputeClosureAdditions (rules,numNonterminals)
1047: in fn cores =>
1048: ComputeCoreSetClosure(cores,a,numNonterminals,selectCores)
1049: end
1050:
1051: (* undefined now : printCoreSet, coreClosure
1052:
1053: val coreClosure =
1054: if DEBUG then
1055: fn cores =>
1056: (println "coreClosure of";
1057: printCoreSet cores;
1058: println "yields";
1059: let val cores' = coreClosure cores
1060: in
1061: printCoreSet cores';
1062: cores'
1063: end
1064: )
1065: else coreClosure
1066: *)
1067:
1068: (* prop_f_to_c_a: Propagate firsts to closure additions.
1069:
1070: For each item in a core of the form A -> 'a . B 'b, where
1071: B is a nonterminal, all B productions will contain first_string
1072: 'b in their lookahead set
1073: *)
1074:
1075: val prop_f_to_c_a : {first_string : G.Symbol list -> G.Terminal list,
1076: selectCores : G.Nonterminal -> CoreSet.set} ->
1077: (CoreSet.set -> unit) =
1078: fn {first_string = first_string : G.Symbol list -> G.Terminal list,
1079: selectCores = selectCores : G.Nonterminal -> CoreSet.set}
1080: => fn (cores : CoreSet.set) =>
1081:
1082: (* f : check if a core has a . before a nonterminal.
1083: If so, propagate the first set of the string
1084: following the nonterminal to all the productions
1085: derived from the nonterminal
1086: *)
1087:
1088: let val f = fn (CORE {coreRHSafter=(NONTERM b)::r, ...}) =>
1089: let val firsts = first_string r
1090: exception ClosureError
1091: val g = fn a =>
1092: case (CoreSet.find a cores) of
1093: NONE => raise ClosureError
1094: | SOME (CORE {lookaheads=l1, ...}) =>
1095: l1 := Lset.addterms(!l1,firsts)
1096: in CoreSet.app g (selectCores b)
1097: end
1098: | _ => ()
1099:
1100: in (CoreSet.app f cores)
1101: end
1102:
1103: (* set_prop: Prop is a boolean variable which is set to true
1104: for items which propagate their lookaheads to items derived
1105: from them. These items have the form 'a .B 'c, where
1106: 'c derives epsilon. The lookaheads propagate to those items
1107: derived from B through the closure operation, and to the
1108: item GOTO('a .B 'c, B). This function sets prop for all items
1109: in a core set.
1110:
1111: *)
1112:
1113: val set_prop =
1114: fn (nullable_string : G.Symbol list -> bool) =>
1115: let val g = fn (CORE c) =>
1116: let val c' = c
1117: in case c'
1118: of {coreRHSafter=(NONTERM _):: t,prop,...} =>
1119: if (nullable_string t) then prop := true
1120: else ()
1121: | _ => ()
1122: end
1123: in CoreSet.app g (* must be applied to a core set now *)
1124: end
1125:
1126: val hardwire_eof = fn (cores,eof,start) =>
1127: let val f = fn (CORE c) =>
1128: let val {I={coreLHS=lhs,...},lookaheads,...} = c
1129: in if (eqNonterminal(lhs,start)) then
1130: lookaheads := Lset.addterms(!lookaheads,[eof])
1131: else ()
1132: end
1133: in CoreSet.app f cores
1134: end
1135:
1136: (* propagate_l_to_c_a: Propagate lookaheads to closure additions.
1137: If an item in a core has the form A-> 'a .B 'b where B is a
1138: nonterminal, and 'b derives epsilon, then all productions of
1139: B get A's lookahead. Returns true if any change to a
1140: B productions lookahead occurs.
1141: *)
1142:
1143: val propagate_l_to_c_a =
1144: fn {selectCores=selectCores : G.Nonterminal -> CoreSet.set} =>
1145: fn (cores: CoreSet.set, result : bool ref) =>
1146: let val f = fn (CORE c) =>
1147: case c
1148:
1149: (* Check that a core item has the correct form *)
1150:
1151: of {prop=ref true,coreRHSafter=NONTERM n::_,
1152: lookaheads,...}=>
1153: let exception PropClosureError
1154:
1155: (* g: Takes an item whose lookahead depends on the
1156: above item, and merges the above item's
1157: lookahead into the item's lookahead
1158: *)
1159: exception PropClosureError
1160:
1161: val g = fn c =>
1162: case (CoreSet.find c cores) of
1163: (SOME (CORE {lookaheads=l, ...})) =>
1164: l := Lset.mergelookahead
1165: ((!l,!lookaheads),result)
1166: | NONE => raise PropClosureError
1167:
1168: (* apply g to the items directly derived from
1169: NONTERM n.
1170: *)
1171:
1172: in CoreSet.app g (selectCores n)
1173: end
1174: | _ => ()
1175: in CoreSet.app f cores
1176: end
1177:
1178: (* propagate_l_to_g_i: Propagate lookaheads to goto items *)
1179:
1180: val propagate_l_to_g_i =
1181:
1182:
1183: fn (shiftCore : Core -> Core) =>
1184:
1185: (* takes an edge from n1 to n2 *)
1186:
1187: fn ((n1: CoreSet.set, e: G.Symbol, n2 : CoreSet.set),result) =>
1188:
1189: let
1190:
1191: (* match: merge lookaheads of an item into the items
1192: which result from a shift
1193: *)
1194:
1195: val match=
1196: fn (a as (CORE {coreRHSafter=b::_,lookaheads=l1,...})) =>
1197: if eqSymbol(b,e) then
1198: case (CoreSet.find (shiftCore a) n2)
1199: of SOME (CORE {lookaheads=l2,...}) =>
1200: l2 := Lset.mergelookahead((!l2,!l1),result)
1201: | NONE => ()
1202: else ()
1203: | _ => ()
1204: in (CoreSet.app match n1)
1205: end
1206: end;
1207:
1208: functor V2_Lookahead(structure G : V2_LR_GRAMMAR
1209: structure Utils: V2_LR_UTILS
1210: sharing Utils.G = G
1211: ): V2_LOOKAHEAD =
1212: struct
1213: structure NontermMemo = Memo(type Arg = G.Nonterminal)
1214:
1215: structure G = G
1216: structure Utils = Utils
1217: open G Utils
1218:
1219: structure TermSet = FullSet(type elem = Terminal
1220: val gt = gtTerminal
1221: val eq = eqTerminal)
1222:
1223: structure NontermSet = FullSet(type elem = Nonterminal
1224: val gt = gtNonterminal
1225: val eq = eqNonterminal)
1226:
1227: val DEBUG = false
1228:
1229: (* build an enumerated memo-fn over nonterminals *)
1230:
1231: val mkfunctions =
1232: fn {numNonterminals,selectCores,showNonterminal,showTerminalClass} =>
1233: let
1234: val nontermMemo = NontermMemo.enum_memo_fn(nontermHash, numNonterminals)
1235:
1236: (* actual print functions (rather than string generators) *)
1237:
1238: val printTerminalClass = Busy.print o showTerminalClass
1239: val printNonterminal = Busy.print o showNonterminal
1240:
1241: (* The FIRST set construction functions *)
1242:
1243: (* nullable: true if nonterminal "nt" has some null rhs production *)
1244: fun nullable(nt, cores) =
1245: CoreSet.setfold (fn (CORE c,rest) =>
1246: let val {coreRHSafter, ...} = c
1247: in rest orelse (null coreRHSafter)
1248: end) cores false
1249:
1250:
1251: (* memo-ise "nullable", add diags *)
1252: fun prNullable(nt, b) =
1253: (Busy.println("Nullable " ^ showNonterminal nt ^ "? "
1254: ^ case b of true => "YES" | false => "NO"
1255: );
1256: b
1257: )
1258:
1259: val nullable =
1260: nontermMemo(if DEBUG then
1261: fn nt => prNullable(nt, nullable(nt, selectCores nt))
1262: else
1263: fn nt => nullable(nt, selectCores nt)
1264: )
1265:
1266: (* nullable_string: check if a string of terminals and variables is nullable *)
1267:
1268: fun nullable_string (TERM t :: _ ) = false
1269: | nullable_string (NONTERM t :: r ) =
1270: (if nullable t then (nullable_string r) else false)
1271: | nullable_string nil = true
1272:
1273: (* accumulate: look at the start of core right-hand-sides, looking past
1274: nullable nts, applying addObj to the visible symbols. *)
1275: fun accumulate(cores, empty, addObj) =
1276: let
1277: fun accumAlongSymbols(symbols, result) =
1278: case symbols
1279: of (sym as NONTERM nt) :: rest =>
1280: if nullable nt then
1281: accumAlongSymbols(rest, addObj(sym, result))
1282: else
1283: addObj(sym, result)
1284:
1285: | (sym as TERM _) :: _ => addObj(sym, result)
1286:
1287: | nil => result
1288:
1289: fun accumAlongCores(cores, result) =
1290: CoreSet.setfold (fn (CORE c,result) =>
1291: let val {coreRHSafter, ...} = c
1292: in accumAlongSymbols(coreRHSafter, result)
1293: end) cores result
1294: in
1295: accumAlongCores(cores, empty)
1296: end
1297:
1298:
1299: (* first1: the FIRST set of a nonterminal in the grammar. Only looks
1300: at other terminals, but it *is* clever enough to move past nullable
1301: nonterminals at the start of a production. *)
1302: fun first1 nt = accumulate(selectCores nt,
1303: TermSet.empty,
1304: fn (TERM t, set) => TermSet.insert t set
1305: | (_, set) => set
1306: )
1307:
1308: (* memo-ise first1, add diags *)
1309: fun prFirst1(nt, termSet) =
1310: (Busy.print("First1 set of " ^ showNonterminal nt ^ " = { ");
1311: TermSet.app (Busy.withSpace printTerminalClass) termSet;
1312: Busy.println "}";
1313: termSet)
1314: val first1 = nontermMemo(if DEBUG then fn nt => prFirst1(nt, first1 nt)
1315: else first1
1316: )
1317:
1318: (* starters1: given a nonterminal "nt", return the set of nonterminals
1319: which can start its productions. Looks past nullables, but doesn't
1320: recurse *)
1321: fun starters1 nt = accumulate(selectCores nt,
1322: NontermSet.empty,
1323: fn (NONTERM nt, set) =>
1324: NontermSet.insert nt set
1325: | (_, set) => set
1326: )
1327:
1328: (* memo-ise starters1, add diags *)
1329: fun prStarters1(nt, nontermSet) =
1330: (Busy.print("Starters1 set of " ^ showNonterminal nt ^ " = { ");
1331: NontermSet.app (Busy.withSpace printNonterminal) nontermSet;
1332: Busy.println "}";
1333: nontermSet
1334: )
1335:
1336: val starters1 =
1337: nontermMemo(if DEBUG then fn nt => prStarters1(nt, starters1 nt)
1338: else starters1
1339: )
1340:
1341: (* starters: a closure over starters1 *)
1342: fun starters nt = NontermSet.closure(NontermSet.singleton nt, starters1)
1343:
1344: (* memo-ise starters, add diags *)
1345: fun prStarters(nt, nontermSet) =
1346: (Busy.print("Starters set of " ^ showNonterminal nt ^ " = { ");
1347: NontermSet.app (Busy.withSpace printNonterminal) nontermSet;
1348: Busy.println "}";
1349: nontermSet
1350: )
1351:
1352: val starters =
1353: nontermMemo(if DEBUG then fn nt => prStarters(nt, starters nt)
1354: else starters
1355: )
1356:
1357: (* first: maps a nonterminal to its first-set. Get all the starters of
1358: the nonterminal, get the first1 terminal set of each of these,
1359: union the whole lot together *)
1360: fun first nt =
1361: let val startersSet = starters nt
1362: val startersList = startersSet
1363: in
1364: NontermSet.setfold (fn (a,r) => TermSet.union(r,first1 a))
1365: startersList TermSet.empty
1366: end
1367:
1368: (* memo-ise first, add diags *)
1369: fun prFirst(nt, termSet) =
1370: (Busy.print("First set of " ^ showNonterminal nt ^ " = { ");
1371: TermSet.app (Busy.withSpace printTerminalClass) termSet;
1372: Busy.println "}";
1373: termSet
1374: )
1375:
1376: val first =
1377: nontermMemo(if DEBUG then fn nt => prFirst(nt, first nt)
1378: else first
1379: )
1380:
1381:
1382:
1383: (* prefix: all possible terminals starting a symbol list *)
1384: fun prefix symbols =
1385: case symbols
1386: of TERM t :: _ => TermSet.singleton t
1387: | NONTERM nt :: rest =>
1388: if nullable nt then
1389: TermSet.union(first nt, prefix rest)
1390: else
1391: first nt
1392: | nil => TermSet.empty
1393:
1394: in {first_string = fn n => TermSet.make_list (prefix n),
1395: nullable_string = nullable_string}
1396: end
1397: end
1398:
1399: functor V2_LrGraph(structure G: V2_LR_GRAMMAR
1400: structure Utils: V2_LR_UTILS
1401: structure Lookahead: V2_LOOKAHEAD
1402: sharing Lookahead.Utils = Utils
1403: sharing Lookahead.G = Utils.G = G
1404: ) : V2_LR_GRAPH =
1405: struct
1406:
1407: open G Lookahead Utils
1408:
1409: val DEBUG = false
1410:
1411: (* type abbrevs for the type of graph we're generating *)
1412: type State = {state: int, cores: CoreSet.set}
1413:
1414: structure Lr_Graph = Graph
1415: (struct
1416: type node = {state : int, cores : CoreSet.set }
1417: type edge = Symbol
1418: val gt_node = fn ({cores,...}:State,{cores=cores',...}:State) =>
1419: CoreSet.set_gt(cores,cores')
1420: val eq_node = fn ({cores,...}:State,{cores=cores',...}:State) =>
1421: CoreSet.set_eq(cores,cores')
1422: val eq_edge = eqSymbol
1423: val gt_edge = gtSymbol
1424: end)
1425:
1426: type Graph = Lr_Graph.graph
1427:
1428: (* the goto function from State * Symbol to State list *)
1429: fun coreMatch(CORE c, symbol) =
1430: let val {coreRHSafter, ...} = c
1431: in
1432: case coreRHSafter
1433: of (symbol' :: _) => eqSymbol(symbol, symbol')
1434: | _ => false
1435: end
1436:
1437: exception ShiftCore
1438: fun shiftCore (a as (CORE c)) =
1439: case c
1440: of {I, coreRHSbefore, coreRHSafter=hd :: tl, prop,lookaheads} =>
1441: CORE({I=I,
1442: coreRHSbefore=hd :: coreRHSbefore,
1443: coreRHSafter=tl,
1444: prop=prop,
1445: lookaheads = lookaheads
1446: }
1447: )
1448: | _ => raise ShiftCore
1449:
1450: val mkGraph = fn {rules = rules : G.Rule list, verbose = verbose : bool,
1451: eof = eof: G.Terminal,start = start: G.Nonterminal,
1452: termPrecedence = termPrecedence: G.Terminal -> int option,
1453: showTerminalClass=showTerminalClass: G.Terminal -> string,
1454: showTerminalValue=showTerminalValue : G.Terminal -> string,
1455: showNonterminal=showNonterminal : G.Nonterminal -> string,
1456: showAttribute=showAttribute : G.Attribute -> string,
1457: numTerminals=numTerminals : int,
1458: numNonterminals=numNonterminals : int
1459: } =>
1460: let val showSymbol = mkshowSymbol {showTerminalClass=showTerminalClass,
1461: showNonterminal=showNonterminal}
1462: val printCore = printCore {showSymbol = showSymbol,
1463: showNonterminal = showNonterminal,
1464: showTerminalClass = showTerminalClass}
1465: val printCoreSet = printCoreSet {printCore=printCore}
1466: val selectCores = mkselectCores
1467: {rules=rules,numNonterminals=numNonterminals}
1468: val coreClosure = mkcoreClosure {rules=rules,
1469: numNonterminals = numNonterminals,
1470: selectCores = selectCores}
1471:
1472: val {first_string,nullable_string} =
1473: mkfunctions {numNonterminals = numNonterminals,
1474: selectCores = selectCores,
1475: showNonterminal = showNonterminal,
1476: showTerminalClass = showTerminalClass
1477: }
1478: (* the traversal of a set of cores which can shift on "symbol" *)
1479: fun traversal'(cores, symbol, result) =
1480: coreClosure(
1481: CoreSet.setfold (fn (a,result) =>
1482: if coreMatch(a,symbol) then CoreSet.insert (shiftCore a) result
1483: else result) cores result
1484: )
1485:
1486: (* include the symbol itself as well, for convenience in graph
1487: generation *)
1488: fun traversal cores symbol =
1489: (symbol, traversal'(cores, symbol, CoreSet.empty))
1490:
1491: val NextStateNum = ref 0
1492:
1493: val traversal =
1494: if DEBUG then
1495: fn cores =>
1496: fn symbol =>
1497: (Busy.println("Traversal by " ^ showSymbol symbol
1498: ^ " gives"
1499: );
1500: let val (_, cores') = traversal cores symbol
1501: in
1502: printCoreSet cores';
1503: (symbol, cores')
1504: end
1505: )
1506: else
1507: traversal
1508:
1509: (* incorporate1: incorporate a traversal from->symbol->cores into
1510: "graph". Return new graph, and optionally the `to' node, if
1511: it wasn't already present.
1512: *)
1513: fun incorporate1(graph, from: Lr_Graph.node,
1514: (symbol, cores : CoreSet.set)) =
1515: case (Lr_Graph.find_node(graph,{state=0,cores=cores})) of
1516: SOME existingNode =>
1517: (if DEBUG then
1518: (Busy.println "*Existing node found:";
1519: printCoreSet(#cores(existingNode))
1520: )
1521: else ();
1522: (Lr_Graph.add_edge (graph, from, symbol,existingNode),
1523: NONE)
1524: )
1525: | NONE =>
1526: let val _ =
1527: if DEBUG then
1528: (Busy.println("*New state "
1529: ^ makestring (!NextStateNum));
1530: printCoreSet cores
1531: )
1532: else
1533: Busy.dot()
1534:
1535: (* make sure every graph node has * UNIQUE * reference
1536: variables
1537: *)
1538:
1539: val newNode = {cores=copyCoreSet cores,
1540: state=(!NextStateNum)}
1541: val _ = NextStateNum := (!NextStateNum)+1
1542: in (Lr_Graph.add_edge (Lr_Graph.add_node (graph,newNode) , from, symbol,
1543: newNode), SOME newNode)
1544: end
1545:
1546: (* incorporate': takes a graph, a from-node, and a list of traversals
1547: ((symbol*Core set) list). adds any new nodes to the front of "newNodes"
1548: *)
1549: fun incorporate'(graph, from: Lr_Graph.node , traversals, newNodes) =
1550:
1551: case traversals
1552: of this :: rest =>
1553: let val (graph', to) = incorporate1(graph, from, this)
1554: in case to
1555: of SOME node =>
1556: incorporate'(graph', from, rest, node :: newNodes)
1557: | NONE => incorporate'(graph', from, rest, newNodes)
1558: end
1559: | nil => (graph, newNodes)
1560:
1561: fun generateGraph(events, graph) =
1562: case events
1563: of (thisEvent :: restEvents) =>
1564: let
1565: val {state, cores}: State = thisEvent
1566:
1567: val closuredCores = cores
1568: val _ =
1569: if DEBUG then
1570: (Busy.println("*Collecting on event: "
1571: ^ makestring state
1572: );
1573: printCoreSet closuredCores
1574: )
1575: else ()
1576:
1577: val immedSymbols = immediateSymbols closuredCores
1578:
1579: val prSymbol = (Busy.withSpace Busy.print) o showSymbol
1580: val _ =
1581: if DEBUG then
1582: (Busy.print "*Immediate symbols: { ";
1583: map prSymbol immedSymbols;
1584: Busy.println "}"
1585: )
1586: else ()
1587:
1588: val traversals =
1589: List.fold (fn (immed_symbol,r) =>
1590: (traversal closuredCores immed_symbol) :: r)
1591: immedSymbols nil
1592:
1593: val (newGraph, newEvents) =
1594: incorporate'(graph, thisEvent, traversals,restEvents)
1595: in
1596: generateGraph(newEvents, newGraph)
1597: end
1598:
1599: | _ => graph
1600:
1601: (* propagate lookaheads : propagate lookaheads throughout the
1602: graph
1603: *)
1604:
1605: val propagatelookaheads = fn (g : Lr_Graph.graph) =>
1606: let val cores = Lr_Graph.nodes_of g
1607: val cores = List.map (fn c => #cores c) cores
1608: val edges = List.map (fn {From,Edge,To} =>
1609: (#cores(From),Edge,#cores(To)))
1610: (Lr_Graph.EdgeSet.make_list (Lr_Graph.all_edges g))
1611: val gp = ref true;
1612: val cp = ref true;
1613: val _ = List.app (set_prop nullable_string) cores
1614: val _ = List.app (prop_f_to_c_a {first_string=first_string,
1615: selectCores=selectCores}) cores
1616: val closure_prop = fn c =>
1617: propagate_l_to_c_a {selectCores=selectCores} (c,cp)
1618: val goto_prop =
1619: let val goto_prop' = propagate_l_to_g_i shiftCore
1620: in fn e => goto_prop'(e,gp)
1621: end
1622: in while (!gp = true orelse !cp = true) do
1623: (gp := false; cp := false;
1624: output std_out "Propagating lookaheads ...\n";
1625: List.app closure_prop cores;
1626: List.app goto_prop edges
1627: )
1628: end
1629:
1630: (* generate the graph *)
1631: val startCores = copyCoreSet(coreClosure(selectCores start))
1632: val startEvent = {cores=startCores, state=0}
1633:
1634: val _ = if DEBUG then () else Busy.print "Generating State Graph"
1635:
1636: val _ = NextStateNum := 1
1637: val graph = generateGraph([startEvent],
1638: Lr_Graph.add_node(Lr_Graph.null_graph,startEvent))
1639:
1640: val _ = hardwire_eof(startCores,eof,start)
1641: val _ = propagatelookaheads graph
1642: in graph
1643: end
1644: end;
1645: functor V2_TableGen(structure G: V2_LR_GRAMMAR): V2_LR_TABLE =
1646: struct
1647:
1648: structure G = G
1649:
1650: structure Utils =
1651: V2_LrUtils(structure G = G)
1652:
1653: structure Lookahead =
1654: V2_Lookahead(structure G = G
1655: structure Utils = Utils
1656: )
1657:
1658: structure Graph =
1659: V2_LrGraph (
1660: structure G = G
1661: structure Utils = Utils
1662: structure Lookahead = Lookahead
1663: )
1664:
1665: type 'entry Table = 'entry array array
1666:
1667: fun PrTable ((pr : string->unit),
1668: (T : 'entry Table),
1669: (Str: (int * 'entry) -> string),
1670: (EncaseRow : ('entry array -> unit) * (string->unit) ->
1671: 'entry array -> unit)) =
1672: let
1673: val PrintRow = fn (R : 'entry array) =>
1674: let fun f(i,cnt) =
1675: if i<Array.length(R) then
1676: let val s = Str (i,(R sub i))
1677: val cnt =
1678: let val newcount = cnt + size s
1679: in if newcount > 73 then (pr "\\\n\\"; size s)
1680: else newcount
1681: end
1682: in (pr s; f (i+1,cnt))
1683: end
1684: else ()
1685: in f(0,0)
1686: end
1687: fun PrintRows i =
1688: if i < (Array.length T) then
1689: (EncaseRow (PrintRow,pr) (T sub i); PrintRows(i+1))
1690: else ()
1691: in PrintRows 0
1692: end
1693:
1694: fun access(tab, row, col) = (tab sub row) sub col
1695:
1696: (* Generate a table from an initialisation value. Won't work if the
1697: actual value contains references *)
1698: fun genTable(value, r, c) =
1699: let
1700: fun rows 0 = nil
1701: | rows m = array(c, value) :: rows(m - 1)
1702: in
1703: arrayoflist(rows r)
1704: end
1705:
1706: (* assign a table entry, using "resolve" to check it against the existing
1707: entry *)
1708: fun assign(resolve: ('entry * 'entry) -> 'entry,
1709: T: 'entry Table,
1710: Row: int, Col: int,
1711: newEntry: 'entry) =
1712: let val R = T sub Row
1713: val oldEntry = R sub Col
1714:
1715: in update(R, Col, resolve(oldEntry, newEntry))
1716: end
1717:
1718: type State = int
1719: fun showState(state: State) = makestring state
1720:
1721: (* Specific table stuff *)
1722: datatype Action = SHIFT of State
1723: | REDUCE of G.Attribute
1724: | ERROR
1725:
1726: type Prec = int option
1727: type ActionEntry = {action: Action, prec: Prec}
1728: datatype Goto = GOTO of int option
1729:
1730: exception AssignAction (* of ActionEntry * ActionEntry *)
1731: exception AssignGoto of Goto (* Returns the current entry *)
1732:
1733: (* convert integer between 0 and 65535 to a a 2 byte character
1734: string representing the integer, with low byte first *)
1735:
1736: val convert_int = fn (i:int) =>
1737: if i>(256*256-1) then
1738: let exception Convert_int in raise Convert_int end
1739: else
1740: let val make_char = fn (i:int) =>
1741: let val s = makestring i
1742: in (substring("\\000",0,1+3 + (~(size s)))) ^ s
1743: end
1744: in (make_char (i mod 256)) ^ (make_char (i div 256))
1745: end
1746:
1747: local
1748: val make_entry = fn (i,s) => (convert_int (i+1)) ^ s
1749: val showAction = fn states => fn (n : int,{action, prec}) =>
1750: case action
1751: of (REDUCE (G.ATTRIB {num,...})) =>
1752: make_entry(n,convert_int(states+num))
1753: | (SHIFT i) =>
1754: make_entry(n,convert_int(i))
1755: | ERROR => ""
1756: val showGoto =
1757: fn (n:int,(GOTO(SOME j))) =>
1758: make_entry(n,convert_int(j))
1759: | _ => ""
1760: in
1761: val printLr_Table = fn (file : outstream, gotos, actions,
1762: DisplayAttributes,states) =>
1763: let val pr = output file
1764: val prln = fn s => (pr s; pr "\n");
1765: val EncaseRow = fn (PrintRow,pr) => fn r =>
1766: (PrintRow r; pr (convert_int 0); pr "\\\n\\")
1767: val PrintTable = fn (table,entry_print) =>
1768: (pr "\"\\\n\\";
1769: PrTable (pr,table,entry_print,EncaseRow);
1770: prln "\"")
1771: in (pr "\
1772: \structure Lr_Table : MLY_LR_TABLE = \n\
1773: \ struct\n\
1774: \ structure G = G\n\
1775: \ open G\n\
1776: \\n\
1777: \ type State = int \n\
1778: \ val initialState = 0 \n\
1779: \ fun showState(state: State) = makestring state \n\
1780: \\n\
1781: \ (* Specific table stuff *) \n\
1782: \ datatype Action = SHIFT of State \n\
1783: \ | REDUCE of Attribute \n\
1784: \ | ERROR \n\
1785: \ datatype Goto = GOTO of State\n";
1786: pr "local\n\
1787: \ val string_to_int = fn(s,index) => (ordof(s,index) + \n\
1788: \ ordof(s,index+1)*256,index+2)\n";
1789: DisplayAttributes(file);
1790: pr "val numStates =";
1791: prln (makestring states);
1792: pr "\
1793: \ val convert_string_to_list = fn conv_func => fn(s,index) =>\n\
1794: \ let fun f (r,index) =\n\
1795: \ let val (num,index) = string_to_int(s,index)\n\
1796: \ in if num=0 then (rev r,index)\n\
1797: \ else let val (i,index) = string_to_int(s,index)\n\
1798: \ in f((num-1,(conv_func i))::r,index)\n\
1799: \ end\n\
1800: \ end\n\
1801: \ in f(nil,index)\n\
1802: \ end\n\
1803: \ val convert_string_to_array = fn conv_func => fn s =>\n\
1804: \ let val convert_row =convert_string_to_list conv_func\n\
1805: \ fun f(r,index) =\n\
1806: \ if (index < size s) then\n\
1807: \ let val (newlist,index) = convert_row (s,index)\n\
1808: \ in f(newlist::r,index)\n\
1809: \ end\n\
1810: \ else arrayoflist(rev r)\n\
1811: \ in f(nil,0)\n\
1812: \ end\n\
1813: \ val int_to_goto = fn i => GOTO i\n\
1814: \\n\
1815: \ val int_to_action = fn i =>\n\
1816: \ if i >= numStates then\n\
1817: \ get_attribute(i-numStates)\n\
1818: \ else SHIFT i\n\
1819: \ val make_goto_table = convert_string_to_array int_to_goto\n\
1820: \ val make_action_table=convert_string_to_array int_to_action\n";
1821: prln "in";
1822: prln "val actionT = make_action_table";
1823: PrintTable(actions,showAction states);
1824: prln "val gotoT = make_goto_table";
1825: PrintTable(gotos,showGoto);
1826: pr "\
1827: \ exception NotThere\n\
1828: \ fun find(((key:int),data)::b,i) =\n\
1829: \ if (i>key) then find(b,i)\n\
1830: \ else if (i<key) then raise NotThere\n\
1831: \ else data\n\
1832: \ | find (nil,i) = raise NotThere\n\
1833: \ fun action(state,T t) =\n\
1834: \ find(actionT sub state,t) handle NotThere => ERROR\n\
1835: \ exception Goto\n\
1836: \ fun goto(state,NT t) =\n\
1837: \ (case find(gotoT sub state,t)\n\
1838: \ of (GOTO i) => i)\n\
1839: \ handle NotThere => raise Goto\n\
1840: \ end\nend\n")
1841: end
1842: end
1843:
1844: val mktable = fn dest => fn (ALL as
1845: {rules = rules : G.Rule list, verbose=verbose : bool,
1846: eof = eof : G.Terminal, start = start: G.Nonterminal,
1847: termPrecedence = termPrecedence: G.Terminal -> int option,
1848: showTerminalClass= showTerminalClass: G.Terminal -> string,
1849: showTerminalValue=showTerminalValue : G.Terminal -> string,
1850: showNonterminal=showNonterminal : G.Nonterminal -> string,
1851: showAttribute=showAttribute : G.Attribute -> string,
1852: numTerminals=numTerminals : int,
1853: numNonterminals=numNonterminals : int
1854: }) =>
1855: let
1856: val rr_error = ref false
1857:
1858: (* DisplayAttributes: print values for the attributes of the rules,
1859: of the form a{rule #} = ATTRIB ... These values are used in
1860: the printed out version of the Action table. *)
1861:
1862: fun DisplayAttributes (f) =
1863: let val pr = (output f)
1864: in (pr
1865: "val get_attribute= \n\
1866: \ let val convert_back = fn (s,i) =>\n\
1867: \ let val (lhs,ni) = string_to_int(s,i)\n\
1868: \ val (rhsLength,ni) = string_to_int(s,ni)\n\
1869: \ val (num,ni) = string_to_int(s,ni)\n\
1870: \ in (REDUCE(G.ATTRIB{lhs=G.NT lhs,rhsLength=rhsLength,\n\
1871: \ num=num}),ni,num)\n\
1872: \ end\n\
1873: \ val numRules =";
1874: pr (makestring (List.length rules));
1875: pr "\nval attrib_data =\n\"";
1876: app(fn (G.RULE {attribute=G.ATTRIB {lhs,rhsLength,num},...}) =>
1877: (
1878: (* nonterminal number *)
1879:
1880: pr (convert_int (G.nontermHash lhs));
1881:
1882: (* rhs length *)
1883:
1884: pr (convert_int rhsLength);
1885:
1886: (* num *)
1887:
1888: pr (convert_int num);
1889: pr "\\\n\\"
1890: )) rules;
1891:
1892: pr "\"\n\
1893: \ val attrib_array = array(numRules,ERROR)\n\
1894: \ fun convert_string(s,index) =\n\
1895: \ if (index < (size s)) then\n\
1896: \ let val (result,newindex,num)=convert_back(s,index)\n\
1897: \ in (update(attrib_array,num,result);\n\
1898: \ convert_string(s,newindex))\n\
1899: \ end\n\
1900: \ else ()\n\
1901: \ in (convert_string(attrib_data,0); fn i => attrib_array sub i)\n\
1902: \ end\n";
1903: ())
1904: end
1905:
1906: val printTerminalClass = Busy.print o showTerminalClass
1907: val printNonterminal = Busy.print o showNonterminal
1908:
1909: fun srConflict(state, attrib, terminal) =
1910: (Busy.println(showState state ^ ": " ^ "shift/reduce conflict " ^
1911: "(shift " ^ (showTerminalClass terminal) ^ ",reduce " ^
1912: showAttribute attrib ^ ")")
1913: )
1914:
1915: fun precConflict(state, attrib, terminal) =
1916: (Busy.println ((showState state) ^
1917: ": terminal and rule have the same precedence for the");
1918: Busy.println ("shift/reduce conflict " ^
1919: "(shift " ^ (showTerminalClass terminal) ^ ",reduce " ^
1920: showAttribute attrib ^ ")")
1921: )
1922:
1923: fun rrConflict(a1, a2) =
1924: Busy.println("reduce/reduce conflict between "
1925: ^ showAttribute a1 ^ " and " ^ showAttribute a2
1926: )
1927: (* assign an action table entry for state on encountering terminal *)
1928:
1929: (* resolve: precedence handling was modified for nonassociative
1930: terminals. Before, if a rule's precedence was greater than a
1931: terminal's a precedence in a s/r conflict, a reduce was planted.
1932: Otherwise a shift occurred. If a rule's precedence was equal to
1933: a terminal's precedence, a shift was planted, but no warning message
1934: was printed. This does not allow for proper handling of
1935: associativities and precedence in a yacc-like parser generator.
1936:
1937: In yacc, each terminal may have a precedence and an associativity.
1938: A terminal may be left associative, right associative,
1939: or nonassociative. A rule is usually given the precedence of its
1940: rightmost terminal. We want to reduce if the precedence of the
1941: rule is > the terminal, or if the precedences are = and the terminal
1942: is left associative. We want to shift the terminal if the
1943: precedence of the terminal is higher than the rule's precedence,
1944: or if the precedences are equal and the terminal is right associative.
1945: If the precedences are equal and the terminal is nonassociative
1946: this is an error condition.
1947:
1948: We need to print a diagnostic indicating to the user when the
1949: precedences of the rule and the terminal are equal. Then we
1950: can give the rule precedence x, right associative terminals
1951: precedence x+1, left associative terminals precedence x-1, and
1952: nonassociative terminals precedence. x.
1953: *)
1954:
1955:
1956: fun assignAction(actions, state, terminal, entry) =
1957: let fun resolve ({action=ERROR, ...}, x) = x
1958: | resolve (s as {action=SHIFT _, prec=shiftPrec},
1959: r as {action=REDUCE a, prec=redPrec}) =
1960: (case (shiftPrec,redPrec)
1961: of (NONE,_) => (srConflict(state, a, terminal); s)
1962: | (_,NONE) => (srConflict(state, a, terminal); s)
1963: | (SOME (i:int),SOME j) =>
1964: if i = j then (precConflict(state, a, terminal); s)
1965: else if i > j then s
1966: else r
1967: )
1968: | resolve (r as {action=REDUCE _, ...},s as {action=SHIFT _, ...})=
1969: resolve(s,r)
1970: | resolve (r1 as {action=REDUCE a1, ...},
1971: r2 as {action=REDUCE a2, ...}) =
1972: (rrConflict(a1,a2); rr_error := true; r1)
1973: | resolve _ = let exception Resolve in raise Resolve end
1974: in assign(resolve, actions, state, G.termHash terminal, entry)
1975: end
1976:
1977: (* assign a goto entry for a state * nonterminal *)
1978: fun assignGoto(gotos, state, Nonterminal, Entry) =
1979: let fun resolve(GOTO NONE, x) = x |
1980: resolve(Old, _) = raise AssignGoto Old
1981: in
1982: assign(resolve, gotos, state, G.nontermHash Nonterminal, Entry)
1983: end
1984:
1985: (* make table entries for all the graph's edges *)
1986: fun plantEdgeMoves(actions, gotos, allEdges) =
1987: let val f =
1988: fn ({From={state=from,...},Edge,To={state=to,...}}
1989: : Graph.Lr_Graph.EdgeSet.elem) =>
1990: case Edge
1991: of G.TERM t =>
1992: assignAction(actions, from, t,
1993: {action=SHIFT to, prec=termPrecedence t})
1994: | G.NONTERM nt =>
1995: assignGoto(gotos, from, nt, GOTO(SOME to))
1996: in Graph.Lr_Graph.EdgeSet.app f allEdges
1997: end
1998:
1999: (* plant all reductions from a particular state *)
2000: fun plantReductions actions (state,r) =
2001: let val {cores, state} = state
2002:
2003: (* plant a reduction for a core item if the dot is at the end of
2004: the item *)
2005:
2006: val plantReduction =
2007: fn Utils.CORE {coreRHSafter=nil,lookaheads,
2008: I={corePrecedence, coreAttribute, ...},
2009: ...} =>
2010:
2011: (* plant a reduction for each terminal in the
2012: lookahead set *)
2013:
2014: List.app (fn lookahead =>
2015: assignAction(actions,state,lookahead,
2016: {action=REDUCE coreAttribute,
2017: prec=corePrecedence})
2018: ) (Utils.Lset.makelookaheadlist (!lookaheads))
2019:
2020: | _ => ()
2021: val closuredCores = (* coreClosure *) cores
2022:
2023: in (Busy.sendto_list();
2024: Utils.CoreSet.app plantReduction closuredCores;
2025: case Busy.get_list()
2026: of nil => r
2027: | l => (state,l)::r)
2028: end
2029:
2030: (* plant all reductions for all states *)
2031:
2032: fun plantStates(actions: ActionEntry Table,
2033: states: Graph.Lr_Graph.node list) =
2034: List.fold (fn (state,r) => (plantReductions actions) (state,r))
2035: states nil;
2036:
2037: (* Generate graph *)
2038:
2039: val graph = Graph.mkGraph ALL;
2040: val theNodes = Graph.Lr_Graph.nodes_of graph
2041: val theEdges = Graph.Lr_Graph.all_edges graph
2042: val numNodes = Graph.Lr_Graph.num_nodes graph
2043:
2044: val actions=genTable({action=ERROR,prec=NONE},numNodes, numTerminals)
2045: val gotos = genTable(GOTO NONE, numNodes, numNonterminals)
2046:
2047: in (Busy.println "Filling Tables";
2048: if verbose then
2049: (let val outfile = open_out "y.output"
2050: val allerrs = (plantEdgeMoves(actions,gotos,theEdges);
2051: plantStates(actions,theNodes))
2052: val errmsgs = fn state =>
2053: fold (fn ((s,l),r) => if s=state then l::r else r) allerrs
2054: nil
2055: val _ = Busy.sendto_file outfile
2056: val printCore = Utils.printCore
2057: {showSymbol = (Utils.mkshowSymbol
2058: ({showTerminalClass=showTerminalClass,
2059: showNonterminal=showNonterminal})
2060: ),
2061: showTerminalClass = showTerminalClass,
2062: showNonterminal = showNonterminal
2063: }
2064: val printCores = fn (state : int,cores) =>
2065: Utils.CoreSet.app (fn a =>
2066: let val (Utils.CORE c) = a
2067: val {coreRHSafter,
2068: I = {coreLHS,
2069: coreAttribute=Utils.G.ATTRIB {num, ...},
2070: ...},
2071: ...
2072: } = c
2073: in (Busy.print "\t";
2074: printCore a;
2075: case coreRHSafter
2076: of nil => Busy.println (" (reduce by rule "^
2077: (makestring num) ^ ")")
2078: | _ => Busy.println ""
2079: )
2080: end) cores
2081:
2082: val printActions = fn (state : int) =>
2083: let fun f i =
2084: if i < numTerminals then
2085: (case (#action(access(actions,state, i)))
2086: of SHIFT s =>
2087: Busy.println ("\t" ^
2088: (showTerminalClass (G.T i)) ^
2089: "\tshift " ^ (showState s))
2090: | REDUCE (G.ATTRIB {lhs,num,...}) =>
2091: Busy.println ("\t" ^ (showTerminalClass (G.T i))^
2092: "\treduce by rule " ^
2093: (makestring num))
2094: | ERROR => ();
2095: f (i+1))
2096: else ()
2097: fun g i =
2098: if i < numNonterminals then
2099: (case access(gotos, state, i)
2100: of GOTO(SOME s) =>
2101: Busy.println("\t" ^(showNonterminal (G.NT i))^
2102: "\tgoto " ^ (showState s))
2103: | _ => ();
2104: g (i+1))
2105: else ()
2106: in (f 0; g 0)
2107: end
2108: fun print_state a =
2109: let val {state,cores} = a
2110: val cores = (* coreClosure *) cores
2111: in
2112: (Busy.println "";
2113: revapp (revapp Busy.print) (errmsgs state);
2114: Busy.println "";
2115: Busy.println(" state " ^ (makestring state) ^
2116: ":");
2117: Busy.println "";
2118: printCores(state,cores);
2119: Busy.println "";
2120: printActions(state)
2121: )
2122: end
2123:
2124: fun find_state n =
2125: let fun f(a::b) =
2126: let val {state,cores} = a
2127: in if state=n then a else f b
2128: end
2129: in f theNodes
2130: end
2131: fun all_states () =
2132: let fun f i = if i<numNodes then
2133: (print_state (find_state i); f (i+1))
2134: else ()
2135: in f 0
2136: end
2137: in all_states();
2138: Busy.sendto_file std_out;
2139: close_out outfile
2140: end)
2141: else(plantEdgeMoves(actions, gotos,theEdges);
2142: let val errs = (plantStates(actions,theNodes))
2143: in (Busy.sendto_file std_out;
2144: revapp (fn (_,s) => map Busy.print s) errs)
2145: end
2146: );
2147:
2148: if (!rr_error) then raise AssignAction
2149: else printLr_Table(dest,gotos,actions,DisplayAttributes,numNodes)
2150: )
2151: end
2152: end;
2153: structure MLY_MAKE_PARSER =
2154: struct
2155: val print_parser = fn pr => pr
2156: "\
2157: \\n\
2158: \\n\
2159: \signature MLY_GRAMMAR =\n\
2160: \ sig\n\
2161: \ type Terminal\n\
2162: \ type Nonterminal\n\
2163: \ datatype Symbol = TERM of Terminal | NONTERM of Nonterminal\n\
2164: \\n\
2165: \ datatype Attribute = ATTRIB of {lhs:Nonterminal,rhsLength:int,num: int }\n\
2166: \\n\
2167: \ val showTerminalClass : Terminal -> string\n\
2168: \ val showTerminalValue: Terminal -> string\n\
2169: \ val showNonterminal : Nonterminal -> string\n\
2170: \ val eqNonterminal : Nonterminal * Nonterminal -> bool\n\
2171: \ val eqTerminal : Terminal * Terminal -> bool\n\
2172: \\n\
2173: \ type Lineno\n\
2174: \ val lineno : Lineno ref\n\
2175: \ val error: string -> Lineno -> unit\n\
2176: \\n\
2177: \ val ErrTermList : Terminal list\n\
2178: \ val preferred_subst : Terminal -> Terminal list\n\
2179: \ val is_keyword : Terminal -> bool\n\
2180: \ val preferred_insert : Terminal -> bool\n\
2181: \ val eof : Terminal\n\
2182: \ val start : Nonterminal\n\
2183: \ end\n\
2184: \\n\
2185: \signature MLY_LR_TABLE =\n\
2186: \ sig\n\
2187: \ structure G : MLY_GRAMMAR\n\
2188: \ \n\
2189: \ type State\n\
2190: \ val initialState: State\n\
2191: \ val showState: State -> string\n\
2192: \\n\
2193: \ datatype Action = SHIFT of State | REDUCE of G.Attribute | ERROR\n\
2194: \ val action: State * G.Terminal -> Action\n\
2195: \ val actionT : (int * Action) list array\n\
2196: \ val goto: State * G.Nonterminal -> State\n\
2197: \ end\n\
2198: \\n\
2199: \signature MLY_ACTIONS = \n\
2200: \ sig \n\
2201: \ type Value\n\
2202: \ val ErrValList : Value list\n\
2203: \ val VOID : Value\n\
2204: \ val rule : (int * Value list) -> (Value * Value list)\n\
2205: \ end\n\
2206: \\n\
2207: \\n\
2208: \signature MLY_PARSER =\n\
2209: \ sig\n\
2210: \ structure A: MLY_GRAMMAR\n\
2211: \ structure B: MLY_ACTIONS\n\
2212: \ val parse: (unit -> A.Terminal * B.Value) -> (int*int) -> B.Value\n\
2213: \ end;\n\
2214: \\n\
2215: \functor ParserGen(structure Lr_Table : MLY_LR_TABLE\n\
2216: \ structure RuleAction: MLY_ACTIONS\n\
2217: \ ) : MLY_PARSER =\n\
2218: \ struct\n\
2219: \ structure A = Lr_Table.G\n\
2220: \ structure B = RuleAction\n\
2221: \ open Lr_Table RuleAction Lr_Table.G\n\
2222: \ exception Error\n\
2223: \ val DEBUG = false\n\
2224: \\n\
2225: \ \n\
2226: \\n\
2227: \ exception Joinlists\n\
2228: \\n\
2229: \ val TestLexVList = \n\
2230: \ let fun f(a::a',b::b',r) = f(a',b',(a,b)::r)\n\
2231: \ | f(nil,nil,r) = rev r\n\
2232: \ | f _ = raise Joinlists\n\
2233: \ in f(ErrTermList,ErrValList,nil)\n\
2234: \ end\n\
2235: \\n\
2236: \ type Element = { term : G.Terminal, value : Value, stack : State list,\n\
2237: \ def_reduces : G.Attribute list, lineno : G.Lineno}\n\
2238: \\n\
2239: \ local \n\
2240: \ val print = output std_out\n\
2241: \ val println = fn s => (print s; print \"\\n\")\n\
2242: \ in\n\
2243: \ fun printStack(stack: State list, n: int) =\n\
2244: \ case stack\n\
2245: \ of (state) :: rest =>\n\
2246: \ (print(\" \" ^ makestring n ^ \": \");\n\
2247: \ println(showState state);\n\
2248: \ printStack(rest, n+1)\n\
2249: \ )\n\
2250: \ | nil => ()\n\
2251: \ \n\
2252: \ fun prAction(stack as (state) :: _, next, action) =\n\
2253: \ (println \"Parse: state stack:\";\n\
2254: \ printStack(stack, 0);\n\
2255: \ print(\" state=\"\n\
2256: \ ^ showState state \n\
2257: \ ^ \" next=\"\n\
2258: \ ^ showTerminalClass next\n\
2259: \ ^ \" action=\"\n\
2260: \ );\n\
2261: \ case action\n\
2262: \ of SHIFT state' =>\n\
2263: \ println(\"SHIFT \" ^ showState state')\n\
2264: \ | REDUCE(ATTRIB{lhs, ...}) =>\n\
2265: \ println(\"REDUCE \" ^ showNonterminal lhs)\n\
2266: \ | ERROR =>\n\
2267: \ println \"ERROR\";\n\
2268: \ action\n\
2269: \ )\n\
2270: \ | prAction (_,_,action) = action\n\
2271: \ end\n\
2272: \\n\
2273: \ \n\
2274: \\n\
2275: \ val pr_errln = error\n\
2276: \ val pr_err = error\n\
2277: \ \n\
2278: \\n\
2279: \ \n\
2280: \\n\
2281: \ fun parse lexer (MaxLookAhead,Size) = \n\
2282: \ let exception Remove\n\
2283: \ val MaxLookAhead = max(0,MaxLookAhead) \n\
2284: \ val Size = max(0,Size)\n\
2285: \\n\
2286: \ val ls = (ref nil) : ((Terminal * Value) * Lineno) list ref\n\
2287: \\n\
2288: \ val lexer = fn () =>\n\
2289: \ case (!ls) of\n\
2290: \ nil => (lexer(),!lineno)\n\
2291: \ | a::b => (ls := b; a)\n\
2292: \\n\
2293: \ \n\
2294: \\n\
2295: \ fun print_lookahead () = \n\
2296: \ (app (fn ((a:Terminal,_),_) => (print (showTerminalClass a); print \" \")) (!ls);\n\
2297: \ print \"\\n\")\n\
2298: \\n\
2299: \ fun remove (0,s) = s\n\
2300: \ | remove (n,a::b) = remove(n-1,b)\n\
2301: \ | remove _ = raise Remove\n\
2302: \\n\
2303: \ exception ParseStep\n\
2304: \ val FixError = ParseStep\n\
2305: \ exception psRemoveBind\n\
2306: \\n\
2307: \ exception Reduce\n\
2308: \\n\
2309: \ fun reduce(l,vs) =\n\
2310: \ fold (fn (ATTRIB{rhsLength,num,...},vs) =>\n\
2311: \ let val (nv,vs) = rule (num,vs)\n\
2312: \ in nv::vs\n\
2313: \ end) l vs\n\
2314: \\n\
2315: \\n\
2316: \ \n\
2317: \\n\
2318: \ fun fix_error(ss as (topstate :: _ ) : State list ,\n\
2319: \ (vs,oss) : (Value list * State list),\n\
2320: \ queue as (x,y) : (Element list * Element list),\n\
2321: \ reductions : G.Attribute list,\n\
2322: \ lexv as ((term,value),lineno),\n\
2323: \ c : int,\n\
2324: \ min_advance : int,\n\
2325: \ max_advance : int) =\n\
2326: \ let\n\
2327: \\n\
2328: \ val _ = pr_errln(\"syntax error found at \" ^\n\
2329: \ (showTerminalClass term)) lineno\n\
2330: \\n\
2331: \ val min_delta = 3\n\
2332: \\n\
2333: \ \n\
2334: \\n\
2335: \ val toklist = x@(rev ({term=term,value=value,lineno=lineno,\n\
2336: \ stack=oss,def_reduces=nil}::y))\n\
2337: \\n\
2338: \ \n\
2339: \\n\
2340: \ datatype Oper = INSERT | DELETE | SUBST of Terminal\n\
2341: \ datatype Change = CHANGE of {pos : int, distance : int,\n\
2342: \ term : Terminal, value : Value,\n\
2343: \ oper : Oper,lineno : Lineno}\n\
2344: \\n\
2345: \ val print_change = fn (CHANGE {pos,distance,term,value,oper,lineno}) =>\n\
2346: \ (print (\"{ pos= \" ^ (makestring pos));\n\
2347: \ print (\" dis= \" ^ (makestring distance));\n\
2348: \ print (\" term = \" ^ (showTerminalClass term));\n\
2349: \ print (\"oper= \" ^ (case oper\n\
2350: \ of INSERT => \"INSERT \"\n\
2351: \ | SUBST _ => \"SUBST \"\n\
2352: \ | DELETE => \"DELETE \"));\n\
2353: \\n\
2354: \ print \"}\\n\")\n\
2355: \\n\
2356: \ val print_cl = map print_change\n\
2357: \\n\
2358: \ \n\
2359: \\n\
2360: \ val ExtraTokens =\n\
2361: \ let fun f (t,0) = rev t\n\
2362: \ | f (t,n) =\n\
2363: \ let val (lexval as ((term,_),_)) = lexer()\n\
2364: \ in f(lexval::t,\n\
2365: \ if eqTerminal(term,eof) then 0 else n-1)\n\
2366: \ end\n\
2367: \ in f(nil,max_advance)\n\
2368: \ end\n\
2369: \\n\
2370: \ \n\
2371: \ \n\
2372: \\n\
2373: \ val LexValueList =\n\
2374: \ (map (fn ({term, value,lineno, ...} : Element) =>\n\
2375: \ ((term,value),lineno))\n\
2376: \ toklist) @ (ExtraTokens)\n\
2377: \\n\
2378: \ val TermList = map (fn ((a,_),l) => (a,l)) LexValueList\n\
2379: \\n\
2380: \ \n\
2381: \\n\
2382: \ exception parseTest\n\
2383: \ exception parseRemoveBind\n\
2384: \\n\
2385: \ fun parse (ss as (s :: _),tokenlist) =\n\
2386: \ (case tokenlist\n\
2387: \ of nil => 0\n\
2388: \ | (e as (a, _ ))::b => \n\
2389: \ (case Lr_Table.action(s,a)\n\
2390: \ of ERROR => length tokenlist\n\
2391: \ | (SHIFT s) => parse(s::ss,b)\n\
2392: \ | (REDUCE (ATTRIB {lhs,rhsLength, ...})) =>\n\
2393: \\n\
2394: \ \n\
2395: \\n\
2396: \ if eqNonterminal(lhs,start) then ~1\n\
2397: \ else case remove(rhsLength,ss)\n\
2398: \ of (ns as (ts :: _ )) =>\n\
2399: \ parse(goto(ts,lhs)::ns,e::b)\n\
2400: \ | _ => raise parseRemoveBind\n\
2401: \ )\n\
2402: \ )\n\
2403: \ | parse _ = raise parseTest\n\
2404: \\n\
2405: \ exception Rev_queue_fold\n\
2406: \\n\
2407: \ \n\
2408: \\n\
2409: \ fun rev_queue_fold (queue : 'b list,toklist : 'c list)\n\
2410: \ (g : (int * 'a * 'b list * 'c list) -> 'a)\n\
2411: \ (start : 'a) =\n\
2412: \\n\
2413: \ let fun f(count,results,nil,_) = results\n\
2414: \ | f(count,results,queue as (q :: q'),toklist as (t :: t')) = \n\
2415: \ f(count+1,g(count,results,queue,toklist),q',t')\n\
2416: \ | f _ = raise Rev_queue_fold\n\
2417: \ in f(0,start,queue,toklist)\n\
2418: \ end\n\
2419: \\n\
2420: \\n\
2421: \ \n\
2422: \\n\
2423: \ fun test (new_token_list :\n\
2424: \ (Terminal * Lineno) * ((Terminal * Lineno) list) ->\n\
2425: \ ((Terminal * Lineno) list),\n\
2426: \ oper : Oper) =\n\
2427: \ let fun test' (count,results, ({stack, ...} : Element) :: _,\n\
2428: \ tl as ((_,lineno) :: _)) =\n\
2429: \ List.fold (fn ((a,v),r) =>\n\
2430: \ let val tokens_left = parse(stack,new_token_list((a,lineno),tl))\n\
2431: \ in if tokens_left > (max_advance - min_advance) then r\n\
2432: \ else (CHANGE {pos=count,term=a,value=v,distance=tokens_left,\n\
2433: \ oper = oper,lineno=lineno})::r\n\
2434: \ end) TestLexVList results\n\
2435: \ in rev_queue_fold (toklist,TermList) test' nil\n\
2436: \ end\n\
2437: \ \n\
2438: \ val SubstChanges =\n\
2439: \ let fun test (count,results,({stack, term, ...} : Element) :: _,\n\
2440: \ (_,lineno) :: rest) =\n\
2441: \ let val max_left = max_advance - min_advance\n\
2442: \ in List.fold (fn ((a,v),r) =>\n\
2443: \ let val tokens_left = parse(stack,(a,lineno)::rest)\n\
2444: \ in if tokens_left > max_left then r\n\
2445: \ else (CHANGE {pos=count,term=a,value=v,distance=tokens_left,\n\
2446: \ oper=SUBST term,lineno=lineno})::r\n\
2447: \ end) TestLexVList results\n\
2448: \ end\n\
2449: \ in rev_queue_fold (toklist,TermList) test nil\n\
2450: \ end\n\
2451: \\n\
2452: \ val DeleteChanges = \n\
2453: \ let fun test(count,results,({term,value,stack, ...} : Element) :: _,\n\
2454: \ termlist as ((_,lineno) :: rest)) =\n\
2455: \ let val tokens_left = parse(stack,rest)\n\
2456: \ in if tokens_left > (max_advance - min_advance) then\n\
2457: \ results\n\
2458: \ else (CHANGE {pos=count,distance=tokens_left,term=term,\n\
2459: \ value=value,oper=DELETE,lineno=lineno}) :: results\n\
2460: \ end\n\
2461: \ in rev_queue_fold (toklist,TermList) test nil\n\
2462: \ end\n\
2463: \\n\
2464: \ val InsertChanges =\n\
2465: \ test ((fn (a,rest) => a::rest),INSERT)\n\
2466: \\n\
2467: \\n\
2468: \\n\
2469: \ local\n\
2470: \\n\
2471: \ fun sieve(a as (CHANGE {distance, ...}),b as (min,results)) =\n\
2472: \ if min>distance then (distance,[a])\n\
2473: \ else if min=distance then (min,a::results)\n\
2474: \ else b\n\
2475: \\n\
2476: \ fun sieve_list l = List.fold sieve l (max_advance,nil)\n\
2477: \\n\
2478: \ in\n\
2479: \\n\
2480: \ val (min1,DeleteChanges) = sieve_list DeleteChanges\n\
2481: \ val (min2,SubstChanges) = sieve_list SubstChanges\n\
2482: \ val (min3,InsertChanges) = sieve_list InsertChanges\n\
2483: \\n\
2484: \ val min0 = min(min(min1,min2),min3)\n\
2485: \\n\
2486: \ val DeleteChanges = if min1>min0 then nil else DeleteChanges\n\
2487: \ val SubstChanges = if min2>min0 then nil else SubstChanges\n\
2488: \ val InsertChanges = if min3>min0 then nil else InsertChanges\n\
2489: \\n\
2490: \ end\n\
2491: \\n\
2492: \ val _ = if DEBUG then\n\
2493: \ (print_cl InsertChanges; print_cl DeleteChanges;\n\
2494: \ print_cl SubstChanges; ())\n\
2495: \ else ()\n\
2496: \\n\
2497: \\n\
2498: \\n\
2499: \ val (InsertChanges,t) =\n\
2500: \ List.fold (fn (a as (CHANGE {term, ...}),(r,t)) => \n\
2501: \ if preferred_insert term then \n\
2502: \ if t then (a::r,t) else ([a],true)\n\
2503: \ else if t then (r,t) else (a::r,t)\n\
2504: \ ) InsertChanges (nil,false)\n\
2505: \\n\
2506: \ val (SubstChanges,t') =\n\
2507: \ List.fold (fn (a as (CHANGE {term=term,oper=SUBST t', ...}),(r,t)) =>\n\
2508: \ if List.exists (fn a=>eqTerminal(a,term)) (preferred_subst t') then\n\
2509: \ if t then (a::r,t) else ([a],true)\n\
2510: \ else if t then (r,t) else (a::r,t)\n\
2511: \ | (a,(r,t)) => (a::r,t) \n\
2512: \ ) SubstChanges (nil,false)\n\
2513: \\n\
2514: \\n\
2515: \\n\
2516: \ local val max_tokens = max_advance - (min_advance+min_delta)\n\
2517: \\n\
2518: \ val remove_keywords = fn l =>\n\
2519: \ List.fold (fn (a as (CHANGE {term,distance,...}),r) =>\n\
2520: \ if (is_keyword term) andalso (distance > max_tokens) then\n\
2521: \ r\n\
2522: \ else a::r) l nil\n\
2523: \\n\
2524: \ in\n\
2525: \\n\
2526: \ val InsertChanges =\n\
2527: \ if t then InsertChanges else remove_keywords InsertChanges\n\
2528: \ \n\
2529: \ val DeleteChanges = remove_keywords DeleteChanges\n\
2530: \\n\
2531: \ val SubstChanges =\n\
2532: \ if t' then SubstChanges else remove_keywords SubstChanges\n\
2533: \\n\
2534: \ end\n\
2535: \ val MinChanges =\n\
2536: \ let val ic = length InsertChanges\n\
2537: \ and dc = length DeleteChanges\n\
2538: \ and sc = length SubstChanges\n\
2539: \ in if ic=1 then SOME InsertChanges\n\
2540: \ else if dc=1 then SOME DeleteChanges\n\
2541: \ else if sc=1 then SOME SubstChanges\n\
2542: \ else if (min0 > (max_advance-(min_advance+min_delta))\n\
2543: \ orelse (ic+dc+sc)=0)\n\
2544: \ then NONE\n\
2545: \ else SOME (InsertChanges @ DeleteChanges @ SubstChanges)\n\
2546: \ end\n\
2547: \\n\
2548: \\n\
2549: \in case MinChanges \n\
2550: \ of (SOME l) =>\n\
2551: \ let fun print_msg (CHANGE {term, oper, lineno, ...}) =\n\
2552: \\n\
2553: \ let val s = \n\
2554: \ case oper\n\
2555: \ of DELETE => \"deleting \"\n\
2556: \ | INSERT => \"inserting \"\n\
2557: \ | SUBST t => \"replacing \" ^ (showTerminalClass t) ^\n\
2558: \ \" with \"\n\
2559: \ in pr_errln (s ^ (showTerminalClass term)) lineno\n\
2560: \ end\n\
2561: \ \n\
2562: \ val a = \n\
2563: \ if (length l > 1)\n\
2564: \ then (\n\
2565: \ if DEBUG then\n\
2566: \ (pr_errln \"multiple fixes possible: could fix it by\" lineno;\n\
2567: \ map print_msg l;\n\
2568: \ pr_errln \"fixing it with\" lineno\n\
2569: \ )\n\
2570: \ else ();\n\
2571: \ print_msg (hd l);\n\
2572: \ (hd l))\n\
2573: \ else (print_msg (hd l); (hd l))\n\
2574: \\n\
2575: \ val pos = (fn (CHANGE {pos, ...}) => pos) a\n\
2576: \ \n\
2577: \ fun f(0,q,termlist,rq',CHANGE {oper,term,value, lineno,\n\
2578: \ ...}) =\n\
2579: \ let val ({stack, ...} : Element) = hd(q)\n\
2580: \ in\n\
2581: \ (case oper\n\
2582: \ of DELETE =>\n\
2583: \ if eqTerminal(term,eof) then\n\
2584: \ (pr_errln \"EOF encountered: goodbye!\" lineno;\n\
2585: \ raise FixError)\n\
2586: \ else ls := (tl termlist) @ (!ls)\n\
2587: \ | (SUBST _) =>\n\
2588: \ ls := (((term,value),lineno)::(tl termlist)) @ (!ls)\n\
2589: \ | INSERT =>\n\
2590: \ ls := (((term,value),lineno)::termlist) @ (!ls));\n\
2591: \ parse_step(stack,(vs,stack),(rev rq',nil),nil,lexer(),\n\
2592: \ Size-pos)\n\
2593: \ end\n\
2594: \ | f(n,e :: r, _ :: termlist, rq',change) =\n\
2595: \ f(n-1,r,termlist,e::rq',change)\n\
2596: \ in f(pos,toklist,LexValueList,nil,a)\n\
2597: \ end\n\
2598: \ | NONE => if eqTerminal(term,eof) then\n\
2599: \ (pr_errln \"EOF encountered: goodbye!\" lineno;\n\
2600: \ raise FixError)\n\
2601: \ else\n\
2602: \ (raise FixError\n\
2603: \\n\
2604: \)\n\
2605: \ end\n\
2606: \\n\
2607: \ | fix_error _ = raise FixError\n\
2608: \ \n\
2609: \ and parse_step(ss as (topstate :: _ ),\n\
2610: \ v as (vs,oss),queue as (x,y),reductions,\n\
2611: \ lexv as ((term,value),lineno),c) =\n\
2612: \ (case (if DEBUG then prAction(ss, term,\n\
2613: \ Lr_Table.action (topstate,term))\n\
2614: \ else Lr_Table.action (topstate,term))\n\
2615: \ of SHIFT s =>\n\
2616: \ let val ss = s::ss\n\
2617: \ val ny = {value=value,def_reduces=reductions,\n\
2618: \ term=term,stack=oss,lineno=lineno}::y\n\
2619: \\n\
2620: \ in if c > 0 then\n\
2621: \ parse_step(ss,(vs,ss),(x,ny),nil,lexer(),c-1)\n\
2622: \ else (case x of nil =>\n\
2623: \ let val ({value,def_reduces, ...}::nx) = rev ny\n\
2624: \ in parse_step(ss,(value::(reduce(def_reduces,vs)),ss),\n\
2625: \ (nx,nil),nil, lexer(),c)\n\
2626: \ end\n\
2627: \ | ({value,def_reduces, ...}::b) =>\n\
2628: \ parse_step(ss,(value::(reduce(def_reduces,vs)),ss),\n\
2629: \ (b,ny),nil,lexer(),c))\n\
2630: \ end\n\
2631: \ | REDUCE (r as (ATTRIB {lhs,rhsLength , ...})) =>\n\
2632: \ if eqNonterminal(lhs,start) then\n\
2633: \ hd(reduce(r::reductions,\n\
2634: \ fold (fn ({value,def_reduces, ...} : Element,vs) =>\n\
2635: \ value::(reduce(def_reduces,vs))) (y@(rev x)) vs))\n\
2636: \ else (\n\
2637: \ case (remove(rhsLength,ss)) \n\
2638: \ of (ss as (ts :: _)) =>\n\
2639: \ (\n\
2640: \\n\
2641: \ parse_step(goto(ts,lhs)::ss,v,queue,\n\
2642: \ r::reductions,lexv,c)\n\
2643: \ )\n\
2644: \ | _ => raise psRemoveBind\n\
2645: \ )\n\
2646: \ \n\
2647: \ | ERROR => fix_error(ss,v,queue,reductions,lexv,c,1,MaxLookAhead))\n\
2648: \ | parse_step _ = raise ParseStep\n\
2649: \ in parse_step([initialState],(nil,[initialState]),\n\
2650: \ (nil,nil),nil,lexer(),Size) \n\
2651: \ end\n\
2652: \end\n\
2653: \"
2654: end
2655: structure Misc =
2656: struct
2657: structure G : V2_LR_GRAMMAR =
2658: struct
2659: datatype Terminal = T of int
2660: and Nonterminal = NT of int
2661:
2662: datatype Symbol = TERM of Terminal
2663: | NONTERM of Nonterminal
2664:
2665: datatype Attribute = ATTRIB of { lhs : Nonterminal,
2666: rhsLength : int,
2667: num : int
2668: }
2669: datatype Rule = RULE of {lhs : Nonterminal,
2670: rhs : Symbol list,
2671: attribute : Attribute,
2672: precedence : int option
2673: }
2674:
2675: val termHash = fn (T i) => i
2676: val nontermHash = fn (NT i) => i
2677: val eqTerminal = fn ((T i),(T i')) => i = i'
2678: val eqNonterminal = fn ((NT i),(NT i')) => i = i'
2679:
2680: val gtTerminal = fn ((T i),(T i')) => i > i'
2681: val gtNonterminal = fn ((NT i),(NT i')) => i > i'
2682: end
2683:
2684: structure MakeTable = V2_TableGen(structure G = G)
2685:
2686: type Lineno = int
2687: val lineno = ref 1
2688: val infile = ref "";
2689:
2690: val error = fn t => fn (l : Lineno) =>
2691: (output std_out ((!infile) ^ ", line " ^
2692: (makestring l) ^ ": " ^ t ^ "\n"))
2693:
2694: datatype LexValue = LEFT | RIGHT | NONASSOC
2695:
2696: type symbol = string
2697: type constr = string
2698: type ty = string list option
2699: type constr_data = {ty: ty,num : int}
2700:
2701: structure PrecSet = FullSet(struct
2702: type elem = (symbol * (int*LexValue))
2703: val gt = fn ((a:string,_),(a',_)) => a > a'
2704: val eq = fn ((a:string,_),(a',_)) => a = a'
2705: end
2706: )
2707:
2708: structure ConstrSet = FullSet(struct
2709: type elem = (constr * {ty : ty, num : int})
2710: val gt = fn ((a:string,_),(a',_)) => a > a'
2711: val eq = fn ((a:string,_),(a',_)) => a = a'
2712: end)
2713:
2714: type decl_data = {start : symbol option,
2715: prec : { d : PrecSet.set,
2716: h : int} option,
2717: nonterm : ConstrSet.set option,
2718: term : ConstrSet.set option,
2719: eof : symbol option,
2720: prefer : (symbol*symbol) list,
2721: iprefer : symbol list,
2722: keyword : symbol list,
2723: structure' : symbol option,
2724: verbose : bool}
2725:
2726: type rhs_data = {rhs:symbol list, code:string, prec: symbol option} list
2727: type rule = { lhs : symbol, rhs : symbol list,
2728: code : string, prec : symbol option }
2729:
2730: val out = ref std_out;
2731:
2732: val len = ref 0
2733: val indent = ref 0
2734: val tw = 4
2735: val inc_margin = fn () => indent := (!indent)+tw
2736: val dec_margin = fn () => indent := (!indent)-tw
2737: val reset_margin = fn () => indent := tw
2738: val err_flag = ref false
2739: (* The next line is bogus, it gets the wrong value of lineno *)
2740: val errmsg = fn x => (err_flag := true; error x (!lineno))
2741: val errln = errmsg
2742:
2743: val say = fn x => output (!out) x
2744:
2745: fun newln () =
2746: let fun f i = if i > 0 then (say " "; f (i-1)) else ()
2747: in (say "\n"; len := (!indent); f(!indent))
2748: end
2749:
2750: val sayln = fn (x : string) =>
2751: let val wl = size x
2752: val new_count = !len + wl
2753: in if (!len = 0 orelse new_count < 78)
2754: then (say x; newln())
2755: else (newln(); say x; newln())
2756: end
2757:
2758: val saywd = fn x : string =>
2759: let val wl = size x
2760: val new_count = !len + wl
2761: in if (!len = 0 orelse new_count < 78)
2762: then (len := new_count; say x)
2763: else (newln(); len := (!len) + wl; say x)
2764: end
2765:
2766: local
2767: fun add_nums(nil,i) = nil
2768: | add_nums ((c,{ty=t, ...} : constr_data)::r,i) =
2769: (c,{ty=t,num=i}) :: add_nums(r,i+1)
2770: in
2771: fun make_tok_dict (l as (_ :: _)) = SOME (ConstrSet.make_set (add_nums(l,0)))
2772: | make_tok_dict nil = NONE
2773: end
2774:
2775: fun save_prec (l as (_::_),parity) =
2776: SOME {d= PrecSet.make_set (map (fn a => (a,(1,parity))) l), h=3}
2777: | save_prec _ = NONE
2778:
2779: fun join_decls {start=a, prec=b, nonterm=c, term=d,eof=e,
2780: iprefer=f,prefer=g,keyword=h,structure'=k,verbose=verbose}
2781: {start=a',prec=b',nonterm=c',term=d',eof=e',
2782: iprefer=f',prefer=g',keyword=h',structure'=k',
2783: verbose=verbose'} =
2784:
2785: let fun j (f,NONE,NONE) = NONE
2786: | j (f,a,NONE) = a
2787: | j (f,NONE,a) = a
2788: | j (f,SOME i,SOME j) = f(i,j)
2789:
2790: fun join e = fn(i,j) =>
2791: (errln ("ignoring duplicate "^e^" declaration"); SOME i)
2792:
2793: fun join_prec({d=t,h=h},{d=t',h=h'}) =
2794: let fun f ((e as (a,(_,p))),t) =
2795: if (PrecSet.exists e t) then
2796: (errln ("ignoring duplicate %prec definition of" ^ a); t)
2797: else (PrecSet.insert (a,(h+1,p)) t)
2798: in SOME {d = PrecSet.setfold f t' t,h=h+3}
2799: end
2800:
2801: in {start= j (join "start",a,a'),
2802: prec=j (join_prec,b,b'),
2803: term = j (join "%term",d,d'),
2804: nonterm = j (join "%nonterm",c,c'),
2805: eof = j (join "%eof",e,e'),
2806: iprefer=f'@f,
2807: prefer=g'@g,
2808: keyword=h'@h,
2809: structure' = j (join "%structure",k,k'),
2810: verbose = verbose orelse verbose'}
2811: end
2812:
2813: local fun print_bool_case (l : string list) =
2814: (sayln "fn t => ";
2815: sayln "case t";
2816: saywd "of ";
2817: List.app (fn s => (saywd s; sayln " => true"; saywd " | ")) l;
2818: sayln "_ => false"
2819: )
2820:
2821: in fun print_is_keyword_func (l : string list) =
2822: (sayln "val is_keyword =";
2823: print_bool_case l)
2824:
2825: and print_preferred_insert_func (l : string list) =
2826: (sayln "val preferred_insert =";
2827: print_bool_case l)
2828:
2829: and print_preferred_subst_func (l : (string*(string list)) list) =
2830: (sayln "val preferred_subst = fn t =>";
2831: sayln "case t";
2832: saywd "of ";
2833: List.app (fn (a,l') =>
2834: (saywd a; saywd " => ";
2835: List.app (fn s => (saywd s; saywd "::")) l';
2836: sayln "nil"; saywd "| "
2837: )
2838: ) l;
2839: sayln " _ => nil"
2840: )
2841: end
2842:
2843: fun printConstrSet(constr_set,name,only_with_values) =
2844: let val _ = (inc_margin(); inc_margin(); inc_margin();
2845: saywd ("datatype " ^ name ^ " = "))
2846: val printed_something =
2847: ConstrSet.revsetfold (fn ((s,{ty=d,...}),result) =>
2848: (if only_with_values then
2849: (case d
2850: of NONE => result
2851: | SOME t =>
2852: (if result then saywd " | " else ();
2853: saywd s;
2854: saywd " of ";
2855: List.app saywd t;
2856: true
2857: )
2858: )
2859: else
2860: (if result then saywd " | " else ();
2861: saywd s;
2862: case d
2863: of NONE => ()
2864: | SOME t => (saywd " of "; List.app saywd t);
2865: true
2866: )
2867: )
2868: ) constr_set false;
2869: in (dec_margin(); dec_margin(); dec_margin(); sayln "";
2870: printed_something)
2871: end
2872:
2873: fun PrConstructors(n,t) =
2874: (saywd ("datatype "^n^ " = ");
2875: ConstrSet.revsetfold( fn ((s,_),r) =>
2876: (if r then saywd " | " else (); saywd s; true)) t false;
2877: newln())
2878:
2879: val make_parser = fn (HEADER : string, MPC_DECLS : decl_data,
2880: TRULELIST : rule list) =>
2881: (let exception SemanticError
2882: in let val ({start=start,prec=p,nonterm=nt,term=t,eof=eof,
2883: prefer=prefer,iprefer=iprefer,keyword=keyword,
2884: structure'=structure',verbose=verbose}) = MPC_DECLS
2885:
2886: val p = case p of NONE => PrecSet.empty | SOME {d,h} => d
2887:
2888: val _ = (let val f = fn d => errln("missing "^d^" definition")
2889: in (case t of NONE => f "%term" | _ => ();
2890: case nt of NONE => f "%nonterm" | _ => ())
2891: end);
2892:
2893: val nonterms =
2894: case nt of SOME i => i
2895: | NONE => raise SemanticError
2896:
2897: val terms = case t of SOME i => i
2898: | NONE => raise SemanticError
2899:
2900: val dummy_data = {ty = NONE,num = 0}
2901: val is_term = fn a => ConstrSet.exists (a,dummy_data) terms
2902: val is_nonterm = fn a => ConstrSet.exists (a,dummy_data) nonterms
2903:
2904: exception Get_type
2905: val get_type = fn (a,terms,nonterms) =>
2906: case (ConstrSet.find (a,dummy_data) terms)
2907: of NONE =>
2908: (case (ConstrSet.find (a,dummy_data) nonterms)
2909: of SOME (_,{ty=t,...}) => t
2910: | _ => raise Get_type)
2911: | SOME (_,{ty=t,...}) => t
2912:
2913: val get_prec = fn a =>
2914: case PrecSet.find (a,(0,LEFT)) p
2915: of NONE => NONE
2916: | SOME (_,(a,_)) => SOME a
2917:
2918: val _ = PrecSet.app
2919: (fn (s,_) =>
2920: if is_term s then ()
2921: else errln (s^" in %prec is not defined as a token")
2922: ) p
2923:
2924: val start =
2925: case start
2926: of NONE => start
2927: | SOME i =>
2928: if is_nonterm i then start
2929: else (errln
2930: (i ^ " in %start is not defined as a nonterminal"); NONE)
2931:
2932: val eof = case eof
2933: of NONE =>(errln ("missing %eof definition"); "")
2934: | SOME i =>
2935: if is_term i then i
2936: else (errln (i ^ " in %eof is not defined as a nonterminal"); "")
2937:
2938: fun make_unique_id s =
2939: if (is_term s) orelse (is_nonterm s) then make_unique_id (s ^ "'")
2940: else s
2941: val void = make_unique_id "mlyVOID"
2942:
2943: local
2944: val dummy_start = make_unique_id "mlySTART"
2945: val nontermlist = rev (map (fn {lhs=lhs : symbol,...} => lhs) TRULELIST)
2946: val start = case start of NONE => (hd nontermlist) | SOME a => a
2947: val dummy_type = get_type(start,terms,nonterms)
2948: val code = case dummy_type of NONE => "" | _ => start
2949: in
2950: val nonterms = ConstrSet.insert (dummy_start,
2951: {ty=dummy_type,num=ConstrSet.card nonterms}) nonterms
2952: val is_nonterm = fn a => ConstrSet.exists (a,dummy_data) nonterms
2953: val TRULELIST={lhs=dummy_start,rhs=[start],code=code,prec=NONE}::
2954: TRULELIST
2955: val start=dummy_start
2956: end
2957:
2958: val (keyword, iprefer) =
2959: let val f = fn x =>
2960: fn (a,r) =>
2961: if (is_term a) then a::r
2962: else (errln (a^" in "^x^" is not defined as a terminal"); r)
2963: in (List.fold (f "%keyword") keyword nil,
2964: List.fold (f "%insert_prefer") iprefer nil)
2965: end
2966:
2967: val prefer =
2968: let val print_err =
2969: fn s => errln (s^" in %prefer is not defined as a terminal")
2970: val f = fn (pair as (a,a'),r) =>
2971: let val flag =
2972: if (is_term a) then false else (print_err a; true)
2973: val flag' =
2974: if (is_term a') then false else (print_err a'; true)
2975: in if (flag orelse flag') then r else (pair::r)
2976: end
2977: in List.fold f prefer nil
2978: end
2979:
2980: (* prefer_map : take list of (sym,sym') where sym is a preferred
2981: substitution for sym', make list of (sym,[ ... syms]) where
2982: elements in the list are all the preferred substitutions for some
2983: sym *)
2984:
2985: val prefer_map =
2986: let
2987: (* take prefer list, second elem of pair, return list of elems
2988: in prefer list w/ same second elem, prefer list - list of
2989: elems *)
2990:
2991: fun g (prefer_list,second_elem) =
2992: List.fold (fn (e as (f,s),(same,differ)) =>
2993: if s=second_elem then (f::same,differ) else (same,e::differ))
2994: prefer_list (nil,nil)
2995:
2996: fun f(nil,prefer_map) = prefer_map
2997: | f(l as (e as (_,s):: _),prefer_map) =
2998: let val (same,differ) = g(l,s)
2999: in f(differ,(s,same)::prefer_map)
3000: end
3001:
3002: in f(prefer,nil)
3003: end
3004:
3005: val _ =
3006: ConstrSet.app (fn (s,_) =>
3007: if is_term s andalso is_nonterm s
3008: then errln (s ^ " is defined as a nonterminal and a terminal")
3009: else ()) terms
3010:
3011: val both = ConstrSet.union(terms,nonterms)
3012:
3013: val _ =
3014: let fun undef s =
3015: if (is_term s orelse is_nonterm s) then ()
3016: else (errln (s ^" is not defined as a terminal or nonterminal"))
3017:
3018: fun undef' s =
3019: if is_nonterm s then ()
3020: else (errln (s ^ " is not defined as a nonterminal"))
3021:
3022: fun check_rule {lhs,rhs,code,prec} = (map undef rhs; undef' lhs)
3023:
3024: in map check_rule TRULELIST
3025: end
3026:
3027: in if (!err_flag = false) then
3028: (MLY_MAKE_PARSER.print_parser say;
3029: reset_margin();
3030: sayln ("structure " ^
3031: (case structure'
3032: of NONE => "C"
3033: | SOME i => i) ^
3034: " = ");
3035: inc_margin();
3036: sayln "struct";
3037: inc_margin();
3038:
3039: (* print HDR structure *)
3040:
3041: sayln "structure HDR =";
3042: inc_margin();
3043: sayln "struct";
3044: say HEADER;
3045: dec_margin();
3046: sayln "";
3047: dec_margin();
3048: sayln "end";
3049:
3050: (* print V structure *)
3051:
3052: inc_margin();
3053: sayln "structure V =";
3054: inc_margin();
3055: sayln "struct";
3056: sayln "open HDR;";
3057:
3058: (* printConstrSet returns true if it printed at least
3059: one constructor *)
3060:
3061: if (printConstrSet(both,"Value",true)=true)
3062: then say " | "
3063: else ();
3064: sayln void;
3065: dec_margin();
3066: sayln "";
3067: dec_margin();
3068: sayln "end";
3069:
3070: (* print LexValue structure *)
3071:
3072: inc_margin();
3073: sayln "structure LexValue =";
3074: inc_margin();
3075: sayln "struct";
3076: sayln "open HDR;";
3077: printConstrSet(terms,"V",false);
3078: dec_margin();
3079: sayln "";
3080: dec_margin();
3081: sayln "end";
3082:
3083: (* print G (the grammar) structure *)
3084:
3085: inc_margin();
3086: sayln "structure G =";
3087: inc_margin();
3088: sayln "struct";
3089: sayln
3090: "\tdatatype Terminal = T of int\n\
3091: \\tand Nonterminal = NT of int\n\
3092: \\n\
3093: \\tval eqTerminal = fn ((T i),(T i')) => i = i'\n\
3094: \\tval eqNonterminal = fn ((NT i),(NT i')) => i = i'";
3095:
3096: saywd "datatype Symbol = TERM of Terminal | ";
3097: sayln "NONTERM of Nonterminal";
3098: newln();
3099:
3100: let fun showSymbol(s,t,constr) =
3101: (sayln ("fun "^s^" t = ");
3102: sayln "case t"; saywd "of ";
3103: ConstrSet.app
3104: (fn (nt,{num,...}) =>
3105: ( say constr;
3106: say (makestring num);
3107: say " => ";
3108: sayln ("\""^nt^"\"");
3109: say " | "
3110: )
3111: ) t;
3112: sayln "_ => \"bogus\"";
3113: newln)
3114: in (showSymbol ("showTerminalClass",terms,"T ");
3115: showSymbol ("showNonterminal",nonterms,"NT "))
3116: end;
3117:
3118: sayln "fun showTerminalValue t = showTerminalClass t";
3119: newln();
3120:
3121: sayln "type Lineno = HDR.Lineno";
3122: sayln "val lineno = HDR.lineno";
3123: sayln "val error = HDR.error";
3124:
3125: saywd "datatype Attribute = ATTRIB of {lhs: Nonterminal,";
3126: sayln "rhsLength: int, num: int }";
3127: newln();
3128: saywd "fun showAttribute(ATTRIB{lhs,...}) =" =
3129: sayln "showNonterminal lhs";
3130: newln();
3131: saywd "datatype Rule = RULE of {lhs:Nonterminal,";
3132: saywd "rhs: Symbol list,";
3133: saywd "attribute : Attribute,";
3134: sayln "precedence : int option }";
3135: newln() ;
3136: saywd "val ErrTermList=";
3137: ConstrSet.app
3138: (fn (x,{ty=NONE,num}) =>
3139: if x=eof then ()
3140: else saywd ("(T " ^ (makestring num) ^ ")::")
3141: | _ => ()) terms;
3142: sayln "nil";
3143:
3144: (* invoke Table generator *)
3145:
3146: let
3147: exception TermNum
3148: exception NontermNum
3149: exception SymbolNum
3150:
3151: val get_term_num = fn t =>
3152: case ConstrSet.find (t,dummy_data) terms
3153: of NONE => raise TermNum
3154: | SOME (_,{num=num,...}) => num
3155:
3156: val get_nonterm_num = fn nt =>
3157: case ConstrSet.find (nt,dummy_data) nonterms
3158: of NONE => raise NontermNum
3159: | SOME (_,{num=num,...}) => num
3160:
3161: val get_symbol = fn s =>
3162: (G.TERM (G.T (get_term_num s)) handle TermNum =>
3163: (G.NONTERM (G.NT (get_nonterm_num s)))
3164: handle NontermNum => raise SymbolNum
3165: )
3166:
3167: val numTerminals = ConstrSet.card terms
3168: val numNonterminals = ConstrSet.card nonterms
3169:
3170: val showTerminalClass =
3171: let val b = array(numTerminals,"bogus")
3172: val f = fn (s,{num=num,...}:constr_data) =>
3173: update(b,num,s)
3174: val _ = ConstrSet.app f terms
3175: in fn (G.T i) => ((b sub i) handle _ => "bogus")
3176: end
3177:
3178: val showNonterminal =
3179: let val b = array(numNonterminals,"bogus")
3180: val f = fn (s,{num=num,...}:constr_data) =>
3181: update(b,num,s)
3182: val _ = ConstrSet.app f nonterms
3183: in fn (G.NT i) => ((b sub i) handle _ => "bogus")
3184: end
3185:
3186: val _ =
3187: (let val get_term_string = fn a =>
3188: "(T " ^ (makestring (get_term_num a)) ^ ")"
3189: in print_is_keyword_func (map get_term_string keyword);
3190: print_preferred_insert_func
3191: (map get_term_string iprefer);
3192: print_preferred_subst_func
3193: (map (fn (a,b) => ((get_term_string a),
3194: map get_term_string b))
3195: prefer_map);
3196: sayln ("val eof = " ^ (get_term_string eof))
3197: end;
3198: sayln ("val start = NT "^(makestring (get_nonterm_num start)));
3199: dec_margin();
3200: sayln "end"
3201: )
3202:
3203: val showTerminalValue = showTerminalClass
3204:
3205: val showAttribute = fn (G.ATTRIB {lhs,rhsLength,num}) =>
3206: showNonterminal lhs
3207:
3208: val eof = G.T (get_term_num eof)
3209: val start = G.NT (get_nonterm_num start)
3210:
3211: val termPrecedence =
3212: let val b = array(numTerminals,NONE)
3213: val f = fn (tk,(j:int,p)) =>
3214: let val prec =
3215: SOME (case p of NONASSOC => j
3216: | RIGHT => j+1
3217: | LEFT => j-1)
3218: in update(b,get_term_num tk,prec)
3219: end
3220: val _ = PrecSet.app f p
3221: in fn (G.T i) => b sub i
3222: end
3223:
3224: val (_,rules) =
3225: List.fold (fn ({lhs=lhs,rhs=rhs,code=_,prec},(n,r)) =>
3226: (let val newlhs = G.NT (get_nonterm_num lhs)
3227: val newrhs = map get_symbol rhs
3228: val newattrib =
3229: G.ATTRIB {lhs=newlhs,
3230: rhsLength=List.length rhs,
3231: num = n
3232: }
3233: val newprec =
3234: let fun f (a::b) =
3235: if (is_nonterm a) then f b else get_prec a
3236: | f nil = NONE
3237: in case prec
3238: of NONE => f (rev rhs)
3239: | SOME i => get_prec i
3240: end
3241: in (n+1,(G.RULE {lhs=newlhs,rhs=newrhs,
3242: attribute=newattrib,
3243: precedence=newprec})::r)
3244: end
3245: )) TRULELIST (0,nil)
3246:
3247: in MakeTable.mktable (!out)
3248: {rules=rules,verbose=verbose,
3249: eof = eof, start = start,
3250: termPrecedence = termPrecedence,
3251: showTerminalClass = showTerminalClass,
3252: showTerminalValue = showTerminalValue,
3253: showNonterminal = showNonterminal,
3254: showAttribute = showAttribute,
3255: numTerminals = numTerminals,
3256: numNonterminals = numNonterminals}
3257: end;
3258:
3259: (* Print R structure - actions for rules *)
3260:
3261: sayln "structure R = ";
3262: inc_margin();
3263: sayln "struct";
3264: saywd "val ErrValList = ";
3265: ConstrSet.app (fn (x,{ty=NONE,...}) =>
3266: if x=eof then ()
3267: else saywd ("(V." ^ void ^ ")::") | _ => ()) terms;
3268: sayln "nil";
3269:
3270: sayln "exception mlyRULE of int";
3271: sayln "fun rule(i,vl) =";
3272: sayln "let open HDR";
3273: sayln " val rule_array = arrayoflist(";
3274:
3275: let fun getconstr s =
3276: case (get_type(s,terms,nonterms))
3277: of NONE => NONE
3278: | SOME _ => SOME ("V."^s)
3279:
3280: (* prlist : print list of arguments for a function for a rule *)
3281:
3282: fun prlist rhs =
3283:
3284:
3285: (* f: list of symbols for rhs, list of pairs of (symbol,last # used)
3286: Takes a rhs symbol, finds the correct variable name (eg. the number
3287: to attach to it, and whether or not to have a variable w/o a number
3288: if the rhs symbol is used only once)
3289: *)
3290:
3291: let fun f(nil,l) = ()
3292: | f(t::rhs,l) =
3293:
3294: let
3295:
3296: fun g((e as (a,i))::b,r) =
3297: if a=t then ((a,i+1)::(b@r),t^(makestring (i+1)))
3298: else g(b,e::r)
3299: | g(nil,r) =
3300: if (List.exists (fn a=>a=t) rhs) then
3301: ((t,1)::r,"("^t^"1)")
3302: else ((t,1)::r,"("^t^" as "^t^"1)")
3303:
3304: val (newlist,var) = g(l,nil)
3305:
3306: in
3307:
3308: (f(rhs,newlist);
3309: saywd ("(" ^
3310: (case (getconstr t)
3311: of NONE => "_"
3312: | SOME i => ("(" ^ i ^ " " ^ var ^ ")")
3313: ) ^
3314: ")");
3315: saywd "::"
3316: )
3317: end
3318:
3319: in
3320: (f(rhs,nil); saywd "r672")
3321: end
3322:
3323: in
3324: List.fold (fn ({lhs,rhs,code,prec},n) =>
3325: ( saywd "(fn (";
3326: prlist rhs;
3327: saywd ") => ((";
3328:
3329: let val constr = getconstr lhs
3330: in case constr
3331: of SOME i => saywd i
3332: | NONE => ();
3333: saywd "(";
3334: saywd code;
3335: saywd ")";
3336: case constr
3337: of SOME i => ()
3338: | NONE => (saywd "; ";
3339: saywd ("V."^void)
3340: );
3341: sayln "),r672)";
3342: if (List.length rhs > 0) then
3343: (saywd " | _ => raise mlyRULE ";
3344: saywd (makestring (n:int))
3345: )
3346: else ();
3347: sayln ")"
3348: end; saywd "::"; n+1)) TRULELIST 0
3349: end;
3350: sayln "nil)";
3351: dec_margin();
3352: sayln "in (rule_array sub i) vl end";
3353: dec_margin();
3354: sayln "type Value = V.Value";
3355: say "val VOID = V.";
3356: sayln void;
3357: sayln "end";
3358: dec_margin();
3359:
3360: (* print P structure - contains parsing function *)
3361:
3362: sayln "structure P = ParserGen(structure Lr_Table = Lr_Table";
3363: dec_margin();
3364: sayln " structure RuleAction = R)";
3365: sayln "fun parse (lex : unit -> (LexValue.V)) i= ";
3366: inc_margin();
3367: saywd "(fn (";
3368: case (ConstrSet.find (start,dummy_data) nonterms) of
3369: SOME (_,{ty=SOME _,...})
3370: => (saywd "V."; saywd start; sayln " a) => a)")
3371: | _ => sayln "_) => ())";
3372: sayln "(P.parse (fn () => ";
3373: inc_margin();
3374: sayln "(case lex() of ";
3375: ConstrSet.setfold (fn ((x,{ty=constr,num}),result) =>
3376: (if result then () else saywd " | ";
3377: say "(LexValue."; say x;
3378: case constr
3379: of NONE => (say ") => (G.T ";
3380: say (makestring num);
3381: sayln ("," ^ "V." ^ void ^")"))
3382: | _ => (say " a) => (G.T ";
3383: say (makestring num);
3384: sayln ("," ^ "V." ^ x ^ " a)"));
3385: false))
3386: terms true;
3387: dec_margin(); dec_margin();
3388: sayln ")) i)";
3389: sayln "end";
3390: ()
3391: )
3392: else ()
3393: end handle SemanticError => ()
3394: end)
3395: end
3396:
3397:
3398: signature MLY_GRAMMAR =
3399: sig
3400: type Terminal
3401: type Nonterminal
3402: datatype Symbol = TERM of Terminal | NONTERM of Nonterminal
3403:
3404: datatype Attribute = ATTRIB of {lhs:Nonterminal,rhsLength:int,num: int }
3405:
3406: val showTerminalClass : Terminal -> string
3407: val showTerminalValue: Terminal -> string
3408: val showNonterminal : Nonterminal -> string
3409: val eqNonterminal : Nonterminal * Nonterminal -> bool
3410: val eqTerminal : Terminal * Terminal -> bool
3411:
3412: type Lineno
3413: val lineno : Lineno ref
3414: val error: string -> Lineno -> unit
3415:
3416: val ErrTermList : Terminal list
3417: val preferred_subst : Terminal -> Terminal list
3418: val is_keyword : Terminal -> bool
3419: val preferred_insert : Terminal -> bool
3420: val eof : Terminal
3421: val start : Nonterminal
3422: end
3423:
3424: signature MLY_LR_TABLE =
3425: sig
3426: structure G : MLY_GRAMMAR
3427:
3428: type State
3429: val initialState: State
3430: val showState: State -> string
3431:
3432: datatype Action = SHIFT of State | REDUCE of G.Attribute | ERROR
3433: val action: State * G.Terminal -> Action
3434: val actionT : (int * Action) list array
3435: val goto: State * G.Nonterminal -> State
3436: end
3437:
3438: signature MLY_ACTIONS =
3439: sig
3440: type Value
3441: val ErrValList : Value list
3442: val VOID : Value
3443: val rule : (int * Value list) -> (Value * Value list)
3444: end
3445:
3446:
3447: signature MLY_PARSER =
3448: sig
3449: structure A: MLY_GRAMMAR
3450: structure B: MLY_ACTIONS
3451: val parse: (unit -> A.Terminal * B.Value) -> (int*int) -> B.Value
3452: end;
3453:
3454: functor ParserGen(structure Lr_Table : MLY_LR_TABLE
3455: structure RuleAction: MLY_ACTIONS
3456: ) : MLY_PARSER =
3457: struct
3458: structure A = Lr_Table.G
3459: structure B = RuleAction
3460: open Lr_Table RuleAction Lr_Table.G
3461: exception Error
3462: val DEBUG = false
3463:
3464:
3465:
3466: exception Joinlists
3467:
3468: val TestLexVList =
3469: let fun f(a::a',b::b',r) = f(a',b',(a,b)::r)
3470: | f(nil,nil,r) = rev r
3471: | f _ = raise Joinlists
3472: in f(ErrTermList,ErrValList,nil)
3473: end
3474:
3475: type Element = { term : G.Terminal, value : Value, stack : State list,
3476: def_reduces : G.Attribute list, lineno : G.Lineno}
3477:
3478: local
3479: val print = output std_out
3480: val println = fn s => (print s; print "\n")
3481: in
3482: fun printStack(stack: State list, n: int) =
3483: case stack
3484: of (state) :: rest =>
3485: (print(" " ^ makestring n ^ ": ");
3486: println(showState state);
3487: printStack(rest, n+1)
3488: )
3489: | nil => ()
3490:
3491: fun prAction(stack as (state) :: _, next, action) =
3492: (println "Parse: state stack:";
3493: printStack(stack, 0);
3494: print(" state="
3495: ^ showState state
3496: ^ " next="
3497: ^ showTerminalClass next
3498: ^ " action="
3499: );
3500: case action
3501: of SHIFT state' =>
3502: println("SHIFT " ^ showState state')
3503: | REDUCE(ATTRIB{lhs, ...}) =>
3504: println("REDUCE " ^ showNonterminal lhs)
3505: | ERROR =>
3506: println "ERROR";
3507: action
3508: )
3509: | prAction (_,_,action) = action
3510: end
3511:
3512:
3513:
3514: val pr_errln = error
3515: val pr_err = error
3516:
3517:
3518:
3519:
3520: fun parse lexer (MaxLookAhead,Size) =
3521: let exception Remove
3522: val MaxLookAhead = max(0,MaxLookAhead)
3523: val Size = max(0,Size)
3524:
3525: val ls = (ref nil) : ((Terminal * Value) * Lineno) list ref
3526:
3527: val lexer = fn () =>
3528: case (!ls) of
3529: nil => (lexer(),!lineno)
3530: | a::b => (ls := b; a)
3531:
3532:
3533:
3534: fun print_lookahead () =
3535: (app (fn ((a:Terminal,_),_) => (print (showTerminalClass a); print " ")) (!ls);
3536: print "\n")
3537:
3538: fun remove (0,s) = s
3539: | remove (n,a::b) = remove(n-1,b)
3540: | remove _ = raise Remove
3541:
3542: exception ParseStep
3543: val FixError = ParseStep
3544: exception psRemoveBind
3545:
3546: exception Reduce
3547:
3548: fun reduce(l,vs) =
3549: fold (fn (ATTRIB{rhsLength,num,...},vs) =>
3550: let val (nv,vs) = rule (num,vs)
3551: in nv::vs
3552: end) l vs
3553:
3554:
3555:
3556:
3557: fun fix_error(ss as (topstate :: _ ) : State list ,
3558: (vs,oss) : (Value list * State list),
3559: queue as (x,y) : (Element list * Element list),
3560: reductions : G.Attribute list,
3561: lexv as ((term,value),lineno),
3562: c : int,
3563: min_advance : int,
3564: max_advance : int) =
3565: let
3566:
3567: val _ = pr_errln("syntax error found at " ^
3568: (showTerminalClass term)) lineno
3569:
3570: val min_delta = 3
3571:
3572:
3573:
3574: val toklist = x@(rev ({term=term,value=value,lineno=lineno,
3575: stack=oss,def_reduces=nil}::y))
3576:
3577:
3578:
3579: datatype Oper = INSERT | DELETE | SUBST of Terminal
3580: datatype Change = CHANGE of {pos : int, distance : int,
3581: term : Terminal, value : Value,
3582: oper : Oper,lineno : Lineno}
3583:
3584: val print_change = fn (CHANGE {pos,distance,term,value,oper,lineno}) =>
3585: (print ("{ pos= " ^ (makestring pos));
3586: print (" dis= " ^ (makestring distance));
3587: print (" term = " ^ (showTerminalClass term));
3588: print ("oper= " ^ (case oper
3589: of INSERT => "INSERT "
3590: | SUBST _ => "SUBST "
3591: | DELETE => "DELETE "));
3592:
3593: print "}\n")
3594:
3595: val print_cl = map print_change
3596:
3597:
3598:
3599: val ExtraTokens =
3600: let fun f (t,0) = rev t
3601: | f (t,n) =
3602: let val (lexval as ((term,_),_)) = lexer()
3603: in f(lexval::t,
3604: if eqTerminal(term,eof) then 0 else n-1)
3605: end
3606: in f(nil,max_advance)
3607: end
3608:
3609:
3610:
3611:
3612: val LexValueList =
3613: (map (fn ({term, value,lineno, ...} : Element) =>
3614: ((term,value),lineno))
3615: toklist) @ (ExtraTokens)
3616:
3617: val TermList = map (fn ((a,_),l) => (a,l)) LexValueList
3618:
3619:
3620:
3621: exception parseTest
3622: exception parseRemoveBind
3623:
3624: fun parse (ss as (s :: _),tokenlist) =
3625: (case tokenlist
3626: of nil => 0
3627: | (e as (a, _ ))::b =>
3628: (case Lr_Table.action(s,a)
3629: of ERROR => length tokenlist
3630: | (SHIFT s) => parse(s::ss,b)
3631: | (REDUCE (ATTRIB {lhs,rhsLength, ...})) =>
3632:
3633:
3634:
3635: if eqNonterminal(lhs,start) then ~1
3636: else case remove(rhsLength,ss)
3637: of (ns as (ts :: _ )) =>
3638: parse(goto(ts,lhs)::ns,e::b)
3639: | _ => raise parseRemoveBind
3640: )
3641: )
3642: | parse _ = raise parseTest
3643:
3644: exception Rev_queue_fold
3645:
3646:
3647:
3648: fun rev_queue_fold (queue : 'b list,toklist : 'c list)
3649: (g : (int * 'a * 'b list * 'c list) -> 'a)
3650: (start : 'a) =
3651:
3652: let fun f(count,results,nil,_) = results
3653: | f(count,results,queue as (q :: q'),toklist as (t :: t')) =
3654: f(count+1,g(count,results,queue,toklist),q',t')
3655: | f _ = raise Rev_queue_fold
3656: in f(0,start,queue,toklist)
3657: end
3658:
3659:
3660:
3661:
3662: fun test (new_token_list :
3663: (Terminal * Lineno) * ((Terminal * Lineno) list) ->
3664: ((Terminal * Lineno) list),
3665: oper : Oper) =
3666: let fun test' (count,results, ({stack, ...} : Element) :: _,
3667: tl as ((_,lineno) :: _)) =
3668: List.fold (fn ((a,v),r) =>
3669: let val tokens_left = parse(stack,new_token_list((a,lineno),tl))
3670: in if tokens_left > (max_advance - min_advance) then r
3671: else (CHANGE {pos=count,term=a,value=v,distance=tokens_left,
3672: oper = oper,lineno=lineno})::r
3673: end) TestLexVList results
3674: in rev_queue_fold (toklist,TermList) test' nil
3675: end
3676:
3677: val SubstChanges =
3678: let fun test (count,results,({stack, term, ...} : Element) :: _,
3679: (_,lineno) :: rest) =
3680: let val max_left = max_advance - min_advance
3681: in List.fold (fn ((a,v),r) =>
3682: let val tokens_left = parse(stack,(a,lineno)::rest)
3683: in if tokens_left > max_left then r
3684: else (CHANGE {pos=count,term=a,value=v,distance=tokens_left,
3685: oper=SUBST term,lineno=lineno})::r
3686: end) TestLexVList results
3687: end
3688: in rev_queue_fold (toklist,TermList) test nil
3689: end
3690:
3691: val DeleteChanges =
3692: let fun test(count,results,({term,value,stack, ...} : Element) :: _,
3693: termlist as ((_,lineno) :: rest)) =
3694: let val tokens_left = parse(stack,rest)
3695: in if tokens_left > (max_advance - min_advance) then
3696: results
3697: else (CHANGE {pos=count,distance=tokens_left,term=term,
3698: value=value,oper=DELETE,lineno=lineno}) :: results
3699: end
3700: in rev_queue_fold (toklist,TermList) test nil
3701: end
3702:
3703: val InsertChanges =
3704: test ((fn (a,rest) => a::rest),INSERT)
3705:
3706:
3707:
3708: local
3709:
3710: fun sieve(a as (CHANGE {distance, ...}),b as (min,results)) =
3711: if min>distance then (distance,[a])
3712: else if min=distance then (min,a::results)
3713: else b
3714:
3715: fun sieve_list l = List.fold sieve l (max_advance,nil)
3716:
3717: in
3718:
3719: val (min1,DeleteChanges) = sieve_list DeleteChanges
3720: val (min2,SubstChanges) = sieve_list SubstChanges
3721: val (min3,InsertChanges) = sieve_list InsertChanges
3722:
3723: val min0 = min(min(min1,min2),min3)
3724:
3725: val DeleteChanges = if min1>min0 then nil else DeleteChanges
3726: val SubstChanges = if min2>min0 then nil else SubstChanges
3727: val InsertChanges = if min3>min0 then nil else InsertChanges
3728:
3729: end
3730:
3731: val _ = if DEBUG then
3732: (print_cl InsertChanges; print_cl DeleteChanges;
3733: print_cl SubstChanges; ())
3734: else ()
3735:
3736:
3737:
3738: val (InsertChanges,t) =
3739: List.fold (fn (a as (CHANGE {term, ...}),(r,t)) =>
3740: if preferred_insert term then
3741: if t then (a::r,t) else ([a],true)
3742: else if t then (r,t) else (a::r,t)
3743: ) InsertChanges (nil,false)
3744:
3745: val (SubstChanges,t') =
3746: List.fold (fn (a as (CHANGE {term=term,oper=SUBST t', ...}),(r,t)) =>
3747: if List.exists (fn a=>eqTerminal(a,term)) (preferred_subst t') then
3748: if t then (a::r,t) else ([a],true)
3749: else if t then (r,t) else (a::r,t)
3750: | (a,(r,t)) => (a::r,t)
3751: ) SubstChanges (nil,false)
3752:
3753:
3754:
3755: local val max_tokens = max_advance - (min_advance+min_delta)
3756:
3757: val remove_keywords = fn l =>
3758: List.fold (fn (a as (CHANGE {term,distance,...}),r) =>
3759: if (is_keyword term) andalso (distance > max_tokens) then
3760: r
3761: else a::r) l nil
3762:
3763: in
3764:
3765: val InsertChanges =
3766: if t then InsertChanges else remove_keywords InsertChanges
3767:
3768: val DeleteChanges = remove_keywords DeleteChanges
3769:
3770: val SubstChanges =
3771: if t' then SubstChanges else remove_keywords SubstChanges
3772:
3773: end
3774: val MinChanges =
3775: let val ic = length InsertChanges
3776: and dc = length DeleteChanges
3777: and sc = length SubstChanges
3778: in if ic=1 then SOME InsertChanges
3779: else if dc=1 then SOME DeleteChanges
3780: else if sc=1 then SOME SubstChanges
3781: else if (min0 > (max_advance-(min_advance+min_delta))
3782: orelse (ic+dc+sc)=0)
3783: then NONE
3784: else SOME (InsertChanges @ DeleteChanges @ SubstChanges)
3785: end
3786:
3787:
3788: in case MinChanges
3789: of (SOME l) =>
3790: let fun print_msg (CHANGE {term, oper, lineno, ...}) =
3791:
3792: let val s =
3793: case oper
3794: of DELETE => "deleting "
3795: | INSERT => "inserting "
3796: | SUBST t => "replacing " ^ (showTerminalClass t) ^
3797: " with "
3798: in pr_errln (s ^ (showTerminalClass term)) lineno
3799: end
3800:
3801: val a =
3802: if (length l > 1)
3803: then (
3804: if DEBUG then
3805: (pr_errln "multiple fixes possible: could fix it by" lineno;
3806: map print_msg l;
3807: pr_errln "fixing it with" lineno
3808: )
3809: else ();
3810: print_msg (hd l);
3811: (hd l))
3812: else (print_msg (hd l); (hd l))
3813:
3814: val pos = (fn (CHANGE {pos, ...}) => pos) a
3815:
3816: fun f(0,q,termlist,rq',CHANGE {oper,term,value, lineno,
3817: ...}) =
3818: let val ({stack, ...} : Element) = hd(q)
3819: in
3820: (case oper
3821: of DELETE =>
3822: if eqTerminal(term,eof) then
3823: (pr_errln "EOF encountered: goodbye!" lineno;
3824: raise FixError)
3825: else ls := (tl termlist) @ (!ls)
3826: | (SUBST _) =>
3827: ls := (((term,value),lineno)::(tl termlist)) @ (!ls)
3828: | INSERT =>
3829: ls := (((term,value),lineno)::termlist) @ (!ls));
3830: parse_step(stack,(vs,stack),(rev rq',nil),nil,lexer(),
3831: Size-pos)
3832: end
3833: | f(n,e :: r, _ :: termlist, rq',change) =
3834: f(n-1,r,termlist,e::rq',change)
3835: in f(pos,toklist,LexValueList,nil,a)
3836: end
3837: | NONE => if eqTerminal(term,eof) then
3838: (pr_errln "EOF encountered: goodbye!" lineno;
3839: raise FixError)
3840: else
3841: (raise FixError
3842:
3843: )
3844: end
3845:
3846: | fix_error _ = raise FixError
3847:
3848: and parse_step(ss as (topstate :: _ ),
3849: v as (vs,oss),queue as (x,y),reductions,
3850: lexv as ((term,value),lineno),c) =
3851: (case (if DEBUG then prAction(ss, term,
3852: Lr_Table.action (topstate,term))
3853: else Lr_Table.action (topstate,term))
3854: of SHIFT s =>
3855: let val ss = s::ss
3856: val ny = {value=value,def_reduces=reductions,
3857: term=term,stack=oss,lineno=lineno}::y
3858:
3859: in if c > 0 then
3860: parse_step(ss,(vs,ss),(x,ny),nil,lexer(),c-1)
3861: else (case x of nil =>
3862: let val ({value,def_reduces, ...}::nx) = rev ny
3863: in parse_step(ss,(value::(reduce(def_reduces,vs)),ss),
3864: (nx,nil),nil, lexer(),c)
3865: end
3866: | ({value,def_reduces, ...}::b) =>
3867: parse_step(ss,(value::(reduce(def_reduces,vs)),ss),
3868: (b,ny),nil,lexer(),c))
3869: end
3870: | REDUCE (r as (ATTRIB {lhs,rhsLength , ...})) =>
3871: if eqNonterminal(lhs,start) then
3872: hd(reduce(r::reductions,
3873: fold (fn ({value,def_reduces, ...} : Element,vs) =>
3874: value::(reduce(def_reduces,vs))) (y@(rev x)) vs))
3875: else (
3876: case (remove(rhsLength,ss))
3877: of (ss as (ts :: _)) =>
3878: (
3879:
3880: parse_step(goto(ts,lhs)::ss,v,queue,
3881: r::reductions,lexv,c)
3882: )
3883: | _ => raise psRemoveBind
3884: )
3885:
3886: | ERROR => fix_error(ss,v,queue,reductions,lexv,c,1,MaxLookAhead))
3887: | parse_step _ = raise ParseStep
3888: in parse_step([initialState],(nil,[initialState]),
3889: (nil,nil),nil,lexer(),Size)
3890: end
3891: end
3892: structure C =
3893: struct
3894: structure HDR =
3895: struct
3896: (* MLPG.GRM: Grammar specification for ml parser generator
3897: Created by David Tarditi
3898: *)
3899: open Misc;
3900:
3901: end
3902: structure V =
3903: struct
3904: open HDR;
3905: datatype Value = CONSTR_LIST of ( constr*constr_data ) list
3906: | HEADER of string | ID of string | IDDOT of
3907: string | ID_LIST of string list | INT of string
3908: | LABEL of string | MPC_DECL of decl_data |
3909: MPC_DECLS of decl_data | PREC of LexValue | PROG
3910: of string | QUALID of string list | RECORDLIST
3911: of string list | RHSLIST of rhs_data | RULEPREC
3912: of string option | SUBST_DECL of ( string*
3913: string ) list | TRULE of rule list | TRULELIST
3914: of rule list | TY of string list | TYPELIST of
3915: string list | TYVAR of string | UNKNOWN of string
3916: | mlyVOID
3917:
3918: end
3919: structure LexValue =
3920: struct
3921: open HDR;
3922: datatype V = ARROW | ASTERISK | BAR | BLOCK | COLON | COMMA
3923: | DELIMITER | EOF | EQUAL | FOR | HEADER of
3924: string | ID of string | IDDOT of string | INT of
3925: string | IPREFER | KEYWORD | LBRACE | LPAREN |
3926: Nonterm | OF | PERCENT_EOF | PREC of LexValue |
3927: PREC_TAG | PREFER | PROG of string | RBRACE |
3928: RPAREN | START | STRUCT | TO | TYVAR of string |
3929: Term | UNKNOWN of string | VAL | VERBOSE
3930:
3931: end
3932: structure G =
3933: struct
3934:
3935: datatype Terminal = T of int
3936: and Nonterminal = NT of int
3937:
3938: val eqTerminal = fn ((T i),(T i')) => i = i'
3939: val eqNonterminal = fn ((NT i),(NT i')) => i = i'
3940: datatype Symbol = TERM of Terminal | NONTERM of Nonterminal
3941:
3942: fun showTerminalClass t =
3943: case t
3944: of T 11 => "ARROW"
3945: | T 12 => "ASTERISK"
3946: | T 25 => "BAR"
3947: | T 0 => "BLOCK"
3948: | T 29 => "COLON"
3949: | T 13 => "COMMA"
3950: | T 34 => "DELIMITER"
3951: | T 26 => "EOF"
3952: | T 1 => "EQUAL"
3953: | T 16 => "FOR"
3954: | T 20 => "HEADER"
3955: | T 28 => "ID"
3956: | T 9 => "IDDOT"
3957: | T 6 => "INT"
3958: | T 18 => "IPREFER"
3959: | T 17 => "KEYWORD"
3960: | T 15 => "LBRACE"
3961: | T 7 => "LPAREN"
3962: | T 31 => "Nonterm"
3963: | T 33 => "OF"
3964: | T 22 => "PERCENT_EOF"
3965: | T 23 => "PREC"
3966: | T 21 => "PREC_TAG"
3967: | T 19 => "PREFER"
3968: | T 24 => "PROG"
3969: | T 14 => "RBRACE"
3970: | T 8 => "RPAREN"
3971: | T 30 => "START"
3972: | T 5 => "STRUCT"
3973: | T 3 => "TO"
3974: | T 10 => "TYVAR"
3975: | T 32 => "Term"
3976: | T 27 => "UNKNOWN"
3977: | T 2 => "VAL"
3978: | T 4 => "VERBOSE"
3979: | _ => "bogus"
3980: fun showNonterminal t =
3981: case t
3982: of NT 9 => "BEGIN"
3983: | NT 7 => "CONSTR_LIST"
3984: | NT 12 => "ID_LIST"
3985: | NT 0 => "LABEL"
3986: | NT 13 => "MPC_DECL"
3987: | NT 14 => "MPC_DECLS"
3988: | NT 1 => "QUALID"
3989: | NT 2 => "RECORDLIST"
3990: | NT 6 => "RHSLIST"
3991: | NT 5 => "RULEPREC"
3992: | NT 4 => "SUBST_DECL"
3993: | NT 11 => "TRULE"
3994: | NT 10 => "TRULELIST"
3995: | NT 8 => "TY"
3996: | NT 3 => "TYPELIST"
3997: | NT 15 => "mlySTART"
3998: | _ => "bogus"
3999: fun showTerminalValue t = showTerminalClass t
4000:
4001: type Lineno = HDR.Lineno
4002: val lineno = HDR.lineno
4003: val error = HDR.error
4004: datatype Attribute = ATTRIB of {lhs: Nonterminal,
4005: rhsLength: int, num: int }
4006:
4007: fun showAttribute(ATTRIB{lhs,...}) =showNonterminal lhs
4008:
4009: datatype Rule = RULE of {lhs:Nonterminal,rhs: Symbol list,
4010: attribute : Attribute,precedence : int option }
4011:
4012: val ErrTermList=(T 11)::(T 12)::(T 25)::(T 0)::(T 29)::
4013: (T 13)::(T 34)::(T 1)::(T 16)::(T 18)::(T 17)::(T 15)::
4014: (T 7)::(T 31)::(T 33)::(T 22)::(T 21)::(T 19)::(T 14)::
4015: (T 8)::(T 30)::(T 5)::(T 3)::(T 32)::(T 2)::(T 4)::nil
4016: val is_keyword =
4017: fn t =>
4018: case t
4019: of _ => false
4020: val preferred_insert =
4021: fn t =>
4022: case t
4023: of _ => false
4024: val preferred_subst = fn t =>
4025: case t
4026: of _ => nil
4027: val eof = (T 26)
4028: val start = NT 15
4029: end
4030: structure Lr_Table : MLY_LR_TABLE =
4031: struct
4032: structure G = G
4033: open G
4034:
4035: type State = int
4036: val initialState = 0
4037: fun showState(state: State) = makestring state
4038:
4039: (* Specific table stuff *)
4040: datatype Action = SHIFT of State
4041: | REDUCE of Attribute
4042: | ERROR
4043: datatype Goto = GOTO of State
4044: local
4045: val string_to_int = fn(s,index) => (ordof(s,index) +
4046: ordof(s,index+1)*256,index+2)
4047: val get_attribute=
4048: let val convert_back = fn (s,i) =>
4049: let val (lhs,ni) = string_to_int(s,i)
4050: val (rhsLength,ni) = string_to_int(s,ni)
4051: val (num,ni) = string_to_int(s,ni)
4052: in (REDUCE(G.ATTRIB{lhs=G.NT lhs,rhsLength=rhsLength,
4053: num=num}),ni,num)
4054: end
4055: val numRules =46
4056: val attrib_data =
4057: "\015\000\001\000\045\000\
4058: \\005\000\000\000\044\000\
4059: \\005\000\002\000\043\000\
4060: \\000\000\001\000\042\000\
4061: \\000\000\001\000\041\000\
4062: \\001\000\002\000\040\000\
4063: \\001\000\001\000\039\000\
4064: \\002\000\003\000\038\000\
4065: \\002\000\005\000\037\000\
4066: \\003\000\003\000\036\000\
4067: \\003\000\003\000\035\000\
4068: \\008\000\003\000\034\000\
4069: \\008\000\003\000\033\000\
4070: \\008\000\001\000\032\000\
4071: \\008\000\002\000\031\000\
4072: \\008\000\004\000\030\000\
4073: \\008\000\003\000\029\000\
4074: \\008\000\002\000\028\000\
4075: \\008\000\003\000\027\000\
4076: \\008\000\001\000\026\000\
4077: \\006\000\005\000\025\000\
4078: \\006\000\003\000\024\000\
4079: \\012\000\000\000\023\000\
4080: \\012\000\002\000\022\000\
4081: \\010\000\000\000\021\000\
4082: \\010\000\002\000\020\000\
4083: \\011\000\003\000\019\000\
4084: \\007\000\001\000\018\000\
4085: \\007\000\003\000\017\000\
4086: \\007\000\003\000\016\000\
4087: \\007\000\005\000\015\000\
4088: \\004\000\003\000\014\000\
4089: \\004\000\005\000\013\000\
4090: \\013\000\001\000\012\000\
4091: \\013\000\002\000\011\000\
4092: \\013\000\002\000\010\000\
4093: \\013\000\002\000\009\000\
4094: \\013\000\002\000\008\000\
4095: \\013\000\002\000\007\000\
4096: \\013\000\002\000\006\000\
4097: \\013\000\002\000\005\000\
4098: \\013\000\002\000\004\000\
4099: \\013\000\002\000\003\000\
4100: \\014\000\000\000\002\000\
4101: \\014\000\002\000\001\000\
4102: \\009\000\004\000\000\000\
4103: \"
4104: val attrib_array = array(numRules,ERROR)
4105: fun convert_string(s,index) =
4106: if (index < (size s)) then
4107: let val (result,newindex,num)=convert_back(s,index)
4108: in (update(attrib_array,num,result);
4109: convert_string(s,newindex))
4110: end
4111: else ()
4112: in (convert_string(attrib_data,0); fn i => attrib_array sub i)
4113: end
4114: val numStates =87
4115: val convert_string_to_list = fn conv_func => fn(s,index) =>
4116: let fun f (r,index) =
4117: let val (num,index) = string_to_int(s,index)
4118: in if num=0 then (rev r,index)
4119: else let val (i,index) = string_to_int(s,index)
4120: in f((num-1,(conv_func i))::r,index)
4121: end
4122: end
4123: in f(nil,index)
4124: end
4125: val convert_string_to_array = fn conv_func => fn s =>
4126: let val convert_row =convert_string_to_list conv_func
4127: fun f(r,index) =
4128: if (index < size s) then
4129: let val (newlist,index) = convert_row (s,index)
4130: in f(newlist::r,index)
4131: end
4132: else arrayoflist(rev r)
4133: in f(nil,0)
4134: end
4135: val int_to_goto = fn i => GOTO i
4136:
4137: val int_to_action = fn i =>
4138: if i >= numStates then
4139: get_attribute(i-numStates)
4140: else SHIFT i
4141: val make_goto_table = convert_string_to_array int_to_goto
4142: val make_action_table=convert_string_to_array int_to_action
4143: in
4144: val actionT = make_action_table
4145: "\
4146: \\021\000\001\000\000\000\
4147: \\005\000\089\000\006\000\089\000\018\000\089\000\019\000\089\000\
4148: \\020\000\089\000\023\000\089\000\024\000\089\000\031\000\089\000\
4149: \\032\000\089\000\033\000\089\000\035\000\089\000\000\000\
4150: \\027\000\132\000\000\000\
4151: \\005\000\015\000\006\000\014\000\018\000\011\000\019\000\012\000\
4152: \\020\000\013\000\023\000\010\000\024\000\008\000\031\000\009\000\
4153: \\032\000\007\000\033\000\006\000\035\000\004\000\000\000\
4154: \\027\000\108\000\029\000\108\000\000\000\
4155: \\005\000\088\000\006\000\088\000\018\000\088\000\019\000\088\000\
4156: \\020\000\088\000\023\000\088\000\024\000\088\000\031\000\088\000\
4157: \\032\000\088\000\033\000\088\000\035\000\088\000\000\000\
4158: \\029\000\032\000\000\000\
4159: \\029\000\032\000\000\000\
4160: \\005\000\110\000\006\000\110\000\018\000\110\000\019\000\110\000\
4161: \\020\000\110\000\023\000\110\000\024\000\110\000\029\000\110\000\
4162: \\031\000\110\000\032\000\110\000\033\000\110\000\035\000\110\000\000\000\
4163: \\029\000\029\000\000\000\
4164: \\029\000\028\000\000\000\
4165: \\005\000\110\000\006\000\110\000\018\000\110\000\019\000\110\000\
4166: \\020\000\110\000\023\000\110\000\024\000\110\000\029\000\110\000\
4167: \\031\000\110\000\032\000\110\000\033\000\110\000\035\000\110\000\000\000\
4168: \\005\000\110\000\006\000\110\000\018\000\110\000\019\000\110\000\
4169: \\020\000\110\000\023\000\110\000\024\000\110\000\029\000\110\000\
4170: \\031\000\110\000\032\000\110\000\033\000\110\000\035\000\110\000\000\000\
4171: \\029\000\018\000\000\000\
4172: \\029\000\016\000\000\000\
4173: \\005\000\099\000\006\000\099\000\018\000\099\000\019\000\099\000\
4174: \\020\000\099\000\023\000\099\000\024\000\099\000\031\000\099\000\
4175: \\032\000\099\000\033\000\099\000\035\000\099\000\000\000\
4176: \\005\000\098\000\006\000\098\000\018\000\098\000\019\000\098\000\
4177: \\020\000\098\000\023\000\098\000\024\000\098\000\031\000\098\000\
4178: \\032\000\098\000\033\000\098\000\035\000\098\000\000\000\
4179: \\005\000\097\000\006\000\097\000\018\000\097\000\019\000\097\000\
4180: \\020\000\097\000\023\000\097\000\024\000\097\000\026\000\021\000\
4181: \\031\000\097\000\032\000\097\000\033\000\097\000\035\000\097\000\000\000\
4182: \\017\000\019\000\000\000\
4183: \\029\000\020\000\000\000\
4184: \\005\000\101\000\006\000\101\000\018\000\101\000\019\000\101\000\
4185: \\020\000\101\000\023\000\101\000\024\000\101\000\026\000\101\000\
4186: \\031\000\101\000\032\000\101\000\033\000\101\000\035\000\101\000\000\000\
4187: \\029\000\022\000\000\000\
4188: \\017\000\023\000\000\000\
4189: \\029\000\024\000\000\000\
4190: \\005\000\100\000\006\000\100\000\018\000\100\000\019\000\100\000\
4191: \\020\000\100\000\023\000\100\000\024\000\100\000\026\000\100\000\
4192: \\031\000\100\000\032\000\100\000\033\000\100\000\035\000\100\000\000\000\
4193: \\005\000\096\000\006\000\096\000\018\000\096\000\019\000\096\000\
4194: \\020\000\096\000\023\000\096\000\024\000\096\000\029\000\026\000\
4195: \\031\000\096\000\032\000\096\000\033\000\096\000\035\000\096\000\000\000\
4196: \\005\000\109\000\006\000\109\000\018\000\109\000\019\000\109\000\
4197: \\020\000\109\000\022\000\109\000\023\000\109\000\024\000\109\000\
4198: \\025\000\109\000\029\000\109\000\031\000\109\000\032\000\109\000\
4199: \\033\000\109\000\035\000\109\000\000\000\
4200: \\005\000\095\000\006\000\095\000\018\000\095\000\019\000\095\000\
4201: \\020\000\095\000\023\000\095\000\024\000\095\000\029\000\026\000\
4202: \\031\000\095\000\032\000\095\000\033\000\095\000\035\000\095\000\000\000\
4203: \\005\000\094\000\006\000\094\000\018\000\094\000\019\000\094\000\
4204: \\020\000\094\000\023\000\094\000\024\000\094\000\031\000\094\000\
4205: \\032\000\094\000\033\000\094\000\035\000\094\000\000\000\
4206: \\005\000\093\000\006\000\093\000\018\000\093\000\019\000\093\000\
4207: \\020\000\093\000\023\000\093\000\024\000\093\000\031\000\093\000\
4208: \\032\000\093\000\033\000\093\000\035\000\093\000\000\000\
4209: \\005\000\092\000\006\000\092\000\018\000\092\000\019\000\092\000\
4210: \\020\000\092\000\023\000\092\000\024\000\092\000\029\000\026\000\
4211: \\031\000\092\000\032\000\092\000\033\000\092\000\035\000\092\000\000\000\
4212: \\005\000\091\000\006\000\091\000\018\000\091\000\019\000\091\000\
4213: \\020\000\091\000\023\000\091\000\024\000\091\000\026\000\068\000\
4214: \\031\000\091\000\032\000\091\000\033\000\091\000\035\000\091\000\000\000\
4215: \\005\000\105\000\006\000\105\000\018\000\105\000\019\000\105\000\
4216: \\020\000\105\000\023\000\105\000\024\000\105\000\026\000\105\000\
4217: \\031\000\105\000\032\000\105\000\033\000\105\000\034\000\033\000\
4218: \\035\000\105\000\000\000\
4219: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4220: \\029\000\039\000\000\000\
4221: \\005\000\113\000\006\000\113\000\009\000\113\000\010\000\113\000\
4222: \\012\000\113\000\013\000\113\000\014\000\113\000\015\000\113\000\
4223: \\018\000\113\000\019\000\113\000\020\000\113\000\023\000\113\000\
4224: \\024\000\113\000\026\000\113\000\029\000\113\000\031\000\113\000\
4225: \\032\000\113\000\033\000\113\000\035\000\113\000\000\000\
4226: \\007\000\060\000\015\000\056\000\029\000\059\000\000\000\
4227: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4228: \\029\000\039\000\000\000\
4229: \\005\000\119\000\006\000\119\000\009\000\119\000\010\000\119\000\
4230: \\012\000\119\000\013\000\119\000\014\000\119\000\015\000\119\000\
4231: \\018\000\119\000\019\000\119\000\020\000\119\000\023\000\119\000\
4232: \\024\000\119\000\026\000\119\000\029\000\119\000\031\000\119\000\
4233: \\032\000\119\000\033\000\119\000\035\000\119\000\000\000\
4234: \\005\000\104\000\006\000\104\000\010\000\040\000\012\000\044\000\
4235: \\013\000\043\000\018\000\104\000\019\000\104\000\020\000\104\000\
4236: \\023\000\104\000\024\000\104\000\026\000\104\000\029\000\039\000\
4237: \\031\000\104\000\032\000\104\000\033\000\104\000\035\000\104\000\000\000\
4238: \\005\000\126\000\006\000\126\000\009\000\126\000\010\000\126\000\
4239: \\012\000\126\000\013\000\126\000\014\000\126\000\015\000\126\000\
4240: \\018\000\126\000\019\000\126\000\020\000\126\000\023\000\126\000\
4241: \\024\000\126\000\026\000\126\000\029\000\126\000\031\000\126\000\
4242: \\032\000\126\000\033\000\126\000\035\000\126\000\000\000\
4243: \\010\000\040\000\029\000\039\000\000\000\
4244: \\005\000\127\000\006\000\127\000\009\000\127\000\010\000\127\000\
4245: \\012\000\127\000\013\000\127\000\014\000\127\000\015\000\127\000\
4246: \\018\000\127\000\019\000\127\000\020\000\127\000\023\000\127\000\
4247: \\024\000\127\000\026\000\127\000\029\000\127\000\031\000\127\000\
4248: \\032\000\127\000\033\000\127\000\035\000\127\000\000\000\
4249: \\005\000\118\000\006\000\118\000\009\000\118\000\010\000\118\000\
4250: \\012\000\118\000\013\000\118\000\014\000\118\000\015\000\118\000\
4251: \\018\000\118\000\019\000\118\000\020\000\118\000\023\000\118\000\
4252: \\024\000\118\000\026\000\118\000\029\000\118\000\031\000\118\000\
4253: \\032\000\118\000\033\000\118\000\035\000\118\000\000\000\
4254: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4255: \\029\000\039\000\000\000\
4256: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4257: \\029\000\039\000\000\000\
4258: \\005\000\121\000\006\000\121\000\009\000\121\000\010\000\040\000\
4259: \\012\000\044\000\013\000\043\000\014\000\121\000\015\000\121\000\
4260: \\018\000\121\000\019\000\121\000\020\000\121\000\023\000\121\000\
4261: \\024\000\121\000\026\000\121\000\029\000\039\000\031\000\121\000\
4262: \\032\000\121\000\033\000\121\000\035\000\121\000\000\000\
4263: \\005\000\120\000\006\000\120\000\009\000\120\000\010\000\040\000\
4264: \\012\000\120\000\013\000\120\000\014\000\120\000\015\000\120\000\
4265: \\018\000\120\000\019\000\120\000\020\000\120\000\023\000\120\000\
4266: \\024\000\120\000\026\000\120\000\029\000\039\000\031\000\120\000\
4267: \\032\000\120\000\033\000\120\000\035\000\120\000\000\000\
4268: \\009\000\052\000\014\000\053\000\000\000\
4269: \\009\000\049\000\010\000\040\000\012\000\044\000\013\000\043\000\
4270: \\014\000\050\000\029\000\039\000\000\000\
4271: \\005\000\116\000\006\000\116\000\009\000\116\000\010\000\116\000\
4272: \\012\000\116\000\013\000\116\000\014\000\116\000\015\000\116\000\
4273: \\018\000\116\000\019\000\116\000\020\000\116\000\023\000\116\000\
4274: \\024\000\116\000\026\000\116\000\029\000\116\000\031\000\116\000\
4275: \\032\000\116\000\033\000\116\000\035\000\116\000\000\000\
4276: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4277: \\029\000\039\000\000\000\
4278: \\009\000\123\000\010\000\040\000\012\000\044\000\013\000\043\000\
4279: \\014\000\123\000\029\000\039\000\000\000\
4280: \\010\000\040\000\029\000\039\000\000\000\
4281: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4282: \\029\000\039\000\000\000\
4283: \\009\000\122\000\010\000\040\000\012\000\044\000\013\000\043\000\
4284: \\014\000\122\000\029\000\039\000\000\000\
4285: \\005\000\117\000\006\000\117\000\009\000\117\000\010\000\117\000\
4286: \\012\000\117\000\013\000\117\000\014\000\117\000\015\000\117\000\
4287: \\018\000\117\000\019\000\117\000\020\000\117\000\023\000\117\000\
4288: \\024\000\117\000\026\000\117\000\029\000\117\000\031\000\117\000\
4289: \\032\000\117\000\033\000\117\000\035\000\117\000\000\000\
4290: \\005\000\115\000\006\000\115\000\009\000\115\000\010\000\115\000\
4291: \\012\000\115\000\013\000\115\000\014\000\115\000\015\000\115\000\
4292: \\018\000\115\000\019\000\115\000\020\000\115\000\023\000\115\000\
4293: \\024\000\115\000\026\000\115\000\029\000\115\000\031\000\115\000\
4294: \\032\000\115\000\033\000\115\000\035\000\115\000\000\000\
4295: \\014\000\064\000\015\000\063\000\000\000\
4296: \\030\000\061\000\000\000\
4297: \\030\000\128\000\000\000\
4298: \\030\000\129\000\000\000\
4299: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4300: \\029\000\039\000\000\000\
4301: \\010\000\040\000\012\000\044\000\013\000\043\000\014\000\125\000\
4302: \\015\000\125\000\029\000\039\000\000\000\
4303: \\005\000\114\000\006\000\114\000\009\000\114\000\010\000\114\000\
4304: \\012\000\114\000\013\000\114\000\014\000\114\000\015\000\114\000\
4305: \\018\000\114\000\019\000\114\000\020\000\114\000\023\000\114\000\
4306: \\024\000\114\000\026\000\114\000\029\000\114\000\031\000\114\000\
4307: \\032\000\114\000\033\000\114\000\035\000\114\000\000\000\
4308: \\007\000\060\000\029\000\059\000\000\000\
4309: \\030\000\066\000\000\000\
4310: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4311: \\029\000\039\000\000\000\
4312: \\010\000\040\000\012\000\044\000\013\000\043\000\014\000\124\000\
4313: \\015\000\124\000\029\000\039\000\000\000\
4314: \\029\000\069\000\000\000\
4315: \\005\000\103\000\006\000\103\000\018\000\103\000\019\000\103\000\
4316: \\020\000\103\000\023\000\103\000\024\000\103\000\026\000\103\000\
4317: \\031\000\103\000\032\000\103\000\033\000\103\000\034\000\070\000\
4318: \\035\000\103\000\000\000\
4319: \\008\000\036\000\010\000\040\000\011\000\034\000\016\000\035\000\
4320: \\029\000\039\000\000\000\
4321: \\005\000\102\000\006\000\102\000\010\000\040\000\012\000\044\000\
4322: \\013\000\043\000\018\000\102\000\019\000\102\000\020\000\102\000\
4323: \\023\000\102\000\024\000\102\000\026\000\102\000\029\000\039\000\
4324: \\031\000\102\000\032\000\102\000\033\000\102\000\035\000\102\000\000\000\
4325: \\005\000\090\000\006\000\090\000\018\000\090\000\019\000\090\000\
4326: \\020\000\090\000\023\000\090\000\024\000\090\000\026\000\068\000\
4327: \\031\000\090\000\032\000\090\000\033\000\090\000\035\000\090\000\000\000\
4328: \\027\000\087\000\029\000\074\000\000\000\
4329: \\030\000\076\000\000\000\
4330: \\027\000\107\000\029\000\107\000\000\000\
4331: \\022\000\110\000\025\000\110\000\029\000\110\000\000\000\
4332: \\022\000\082\000\025\000\131\000\029\000\026\000\000\000\
4333: \\026\000\079\000\027\000\106\000\029\000\106\000\000\000\
4334: \\022\000\110\000\025\000\110\000\029\000\110\000\000\000\
4335: \\022\000\082\000\025\000\131\000\029\000\026\000\000\000\
4336: \\025\000\084\000\000\000\
4337: \\029\000\083\000\000\000\
4338: \\025\000\130\000\000\000\
4339: \\026\000\112\000\027\000\112\000\029\000\112\000\000\000\
4340: \\025\000\086\000\000\000\
4341: \\026\000\111\000\027\000\111\000\029\000\111\000\000\000\
4342: \"
4343: val gotoT = make_goto_table
4344: "\
4345: \\010\000\002\000\000\000\
4346: \\015\000\003\000\000\000\
4347: \\000\000\
4348: \\014\000\005\000\000\000\
4349: \\011\000\073\000\000\000\
4350: \\000\000\
4351: \\008\000\072\000\000\000\
4352: \\008\000\031\000\000\000\
4353: \\013\000\030\000\000\000\
4354: \\000\000\
4355: \\000\000\
4356: \\013\000\027\000\000\000\
4357: \\013\000\025\000\000\000\
4358: \\005\000\017\000\000\000\
4359: \\000\000\
4360: \\000\000\
4361: \\000\000\
4362: \\000\000\
4363: \\000\000\
4364: \\000\000\
4365: \\000\000\
4366: \\000\000\
4367: \\000\000\
4368: \\000\000\
4369: \\000\000\
4370: \\000\000\
4371: \\000\000\
4372: \\000\000\
4373: \\000\000\
4374: \\000\000\
4375: \\000\000\
4376: \\000\000\
4377: \\000\000\
4378: \\002\000\037\000\009\000\038\000\000\000\
4379: \\000\000\
4380: \\001\000\058\000\003\000\057\000\000\000\
4381: \\002\000\037\000\004\000\047\000\009\000\048\000\000\000\
4382: \\000\000\
4383: \\002\000\042\000\000\000\
4384: \\000\000\
4385: \\002\000\041\000\000\000\
4386: \\000\000\
4387: \\000\000\
4388: \\002\000\037\000\009\000\046\000\000\000\
4389: \\002\000\037\000\009\000\045\000\000\000\
4390: \\002\000\042\000\000\000\
4391: \\002\000\042\000\000\000\
4392: \\000\000\
4393: \\002\000\042\000\000\000\
4394: \\000\000\
4395: \\002\000\037\000\009\000\051\000\000\000\
4396: \\002\000\042\000\000\000\
4397: \\002\000\055\000\000\000\
4398: \\002\000\037\000\009\000\054\000\000\000\
4399: \\002\000\042\000\000\000\
4400: \\000\000\
4401: \\000\000\
4402: \\000\000\
4403: \\000\000\
4404: \\000\000\
4405: \\000\000\
4406: \\002\000\037\000\009\000\062\000\000\000\
4407: \\002\000\042\000\000\000\
4408: \\000\000\
4409: \\001\000\065\000\000\000\
4410: \\000\000\
4411: \\002\000\037\000\009\000\067\000\000\000\
4412: \\002\000\042\000\000\000\
4413: \\000\000\
4414: \\000\000\
4415: \\002\000\037\000\009\000\071\000\000\000\
4416: \\002\000\042\000\000\000\
4417: \\000\000\
4418: \\012\000\075\000\000\000\
4419: \\000\000\
4420: \\000\000\
4421: \\007\000\078\000\013\000\077\000\000\000\
4422: \\006\000\085\000\000\000\
4423: \\000\000\
4424: \\013\000\080\000\000\000\
4425: \\006\000\081\000\000\000\
4426: \\000\000\
4427: \\000\000\
4428: \\000\000\
4429: \\000\000\
4430: \\000\000\
4431: \\000\000\
4432: \"
4433: exception NotThere
4434: fun find(((key:int),data)::b,i) =
4435: if (i>key) then find(b,i)
4436: else if (i<key) then raise NotThere
4437: else data
4438: | find (nil,i) = raise NotThere
4439: fun action(state,T t) =
4440: find(actionT sub state,t) handle NotThere => ERROR
4441: exception Goto
4442: fun goto(state,NT t) =
4443: (case find(gotoT sub state,t)
4444: of (GOTO i) => i)
4445: handle NotThere => raise Goto
4446: end
4447: end
4448: structure R =
4449: struct
4450: val ErrValList = (V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::
4451: (V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::
4452: (V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::
4453: (V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::
4454: (V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::
4455: (V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::
4456: (V.mlyVOID)::(V.mlyVOID)::(V.mlyVOID)::nil
4457: exception mlyRULE of int
4458: fun rule(i,vl) =
4459: let open HDR
4460: val rule_array = arrayoflist(
4461: (fn (((V.TRULELIST (TRULELIST as TRULELIST1)))::(_)::
4462: ((V.MPC_DECLS (MPC_DECLS as MPC_DECLS1)))::
4463: ((V.HEADER (HEADER as HEADER1)))::r672) => (((
4464: make_parser (HEADER,MPC_DECLS,TRULELIST)); V.mlyVOID),r672)
4465: | _ => raise mlyRULE 0)
4466: ::(fn (((V.MPC_DECL (MPC_DECL as MPC_DECL1)))::
4467: ((V.MPC_DECLS (MPC_DECLS as MPC_DECLS1)))::r672) => ((
4468: V.MPC_DECLS(join_decls MPC_DECLS MPC_DECL)),r672)
4469: | _ => raise mlyRULE 1)
4470: ::(fn (r672) => ((V.MPC_DECLS(
4471: {start=NONE,prec=NONE,nonterm=NONE,term=NONE,eof=NONE,
4472: prefer=nil,iprefer=nil,keyword=nil,structure'=NONE,
4473: verbose=false}
4474: )),r672)
4475: )
4476: ::(fn (((V.CONSTR_LIST (CONSTR_LIST as CONSTR_LIST1)))::(_)::
4477: r672) => ((V.MPC_DECL(
4478: { start=NONE,prec=NONE,nonterm=NONE,
4479: term = make_tok_dict CONSTR_LIST, eof = NONE,
4480: prefer=nil,iprefer=nil,keyword=nil,structure'=NONE,
4481: verbose=false}
4482: )),r672)
4483: | _ => raise mlyRULE 3)
4484: ::(fn (((V.CONSTR_LIST (CONSTR_LIST as CONSTR_LIST1)))::(_)::
4485: r672) => ((V.MPC_DECL(
4486: { start=NONE,prec=NONE,nonterm=make_tok_dict CONSTR_LIST,
4487: term = NONE, eof = NONE,prefer=nil,iprefer=nil,keyword=nil,
4488: structure'=NONE,verbose=false}
4489: )),r672)
4490: | _ => raise mlyRULE 4)
4491: ::(fn (((V.ID_LIST (ID_LIST as ID_LIST1)))::
4492: ((V.PREC (PREC as PREC1)))::r672) => ((V.MPC_DECL(
4493: {start=NONE,prec=save_prec(ID_LIST1,PREC1),
4494: nonterm=NONE,term=NONE,eof=NONE,prefer=nil,iprefer=nil,
4495: keyword=nil,structure'=NONE,verbose=false}
4496: )),r672)
4497: | _ => raise mlyRULE 5)
4498: ::(fn (((V.ID (ID as ID1)))::(_)::r672) => ((V.MPC_DECL(
4499: {start=SOME ID,prec=NONE,nonterm=NONE,structure'=NONE,
4500: term = NONE, eof = NONE,prefer=nil,iprefer=nil,keyword=nil,
4501: verbose=false}
4502: )),r672)
4503: | _ => raise mlyRULE 6)
4504: ::(fn (((V.ID (ID as ID1)))::(_)::r672) => ((V.MPC_DECL(
4505: {start=NONE,prec=NONE,nonterm=NONE,term=NONE,eof=SOME ID,
4506: prefer=nil,iprefer=nil,keyword=nil,structure'=NONE,
4507: verbose=false}
4508: )),r672)
4509: | _ => raise mlyRULE 7)
4510: ::(fn (((V.ID_LIST (ID_LIST as ID_LIST1)))::(_)::r672) => ((
4511: V.MPC_DECL(
4512: {start=NONE,prec=NONE,nonterm=NONE,term=NONE,eof=NONE,
4513: prefer=nil,iprefer=nil,keyword=ID_LIST1,structure'=NONE,
4514: verbose=false}
4515: )),r672)
4516: | _ => raise mlyRULE 8)
4517: ::(fn (((V.ID_LIST (ID_LIST as ID_LIST1)))::(_)::r672) => ((
4518: V.MPC_DECL(
4519: {start=NONE,prec=NONE,nonterm=NONE,term=NONE,eof=NONE,
4520: prefer=nil,iprefer=ID_LIST1,keyword=nil,structure'=NONE,
4521: verbose=false}
4522: )),r672)
4523: | _ => raise mlyRULE 9)
4524: ::(fn (((V.SUBST_DECL (SUBST_DECL as SUBST_DECL1)))::(_)::
4525: r672) => ((V.MPC_DECL(
4526: {start=NONE,prec=NONE,nonterm=NONE,term=NONE,eof=NONE,
4527: prefer=SUBST_DECL1,iprefer=nil,keyword=nil,structure'=NONE,
4528: verbose=false}
4529: )),r672)
4530: | _ => raise mlyRULE 10)
4531: ::(fn (((V.ID (ID as ID1)))::(_)::r672) => ((V.MPC_DECL(
4532: {start=NONE,prec=NONE,nonterm=NONE,term=NONE,eof=NONE,
4533: prefer=nil,iprefer=nil,keyword=nil,structure'=SOME ID,
4534: verbose=false}
4535: )),r672)
4536: | _ => raise mlyRULE 11)
4537: ::(fn ((_)::r672) => ((V.MPC_DECL(
4538: {start=NONE,prec=NONE,nonterm=NONE,term=NONE,eof=NONE,
4539: prefer=nil,iprefer=nil,keyword=nil,structure'=NONE,
4540: verbose=true}
4541: )),r672)
4542: | _ => raise mlyRULE 12)
4543: ::(fn (((V.ID ID2))::(_)::((V.ID (ID1)))::(_)::
4544: ((V.SUBST_DECL (SUBST_DECL as SUBST_DECL1)))::r672) => ((
4545: V.SUBST_DECL((ID1,ID2)::SUBST_DECL)),r672)
4546: | _ => raise mlyRULE 13)
4547: ::(fn (((V.ID ID2))::(_)::((V.ID (ID1)))::r672) => ((
4548: V.SUBST_DECL([(ID1,ID2)])),r672)
4549: | _ => raise mlyRULE 14)
4550: ::(fn (((V.TY (TY as TY1)))::(_)::((V.ID (ID as ID1)))::(_)::
4551: ((V.CONSTR_LIST (CONSTR_LIST as CONSTR_LIST1)))::r672) => ((
4552: V.CONSTR_LIST((ID,{ty=SOME TY,num=0})::CONSTR_LIST)),r672)
4553: | _ => raise mlyRULE 15)
4554: ::(fn (((V.ID (ID as ID1)))::(_)::
4555: ((V.CONSTR_LIST (CONSTR_LIST as CONSTR_LIST1)))::r672) => ((
4556: V.CONSTR_LIST((ID,{ty=NONE,num=0})::CONSTR_LIST)),r672)
4557: | _ => raise mlyRULE 16)
4558: ::(fn (((V.TY (TY as TY1)))::(_)::((V.ID (ID as ID1)))::r672
4559: ) => ((V.CONSTR_LIST([(ID,{ty=SOME TY,num=0})])),r672)
4560: | _ => raise mlyRULE 17)
4561: ::(fn (((V.ID (ID as ID1)))::r672) => ((V.CONSTR_LIST(
4562: [(ID,{ty=NONE,num=0})])),r672)
4563: | _ => raise mlyRULE 18)
4564: ::(fn (((V.RHSLIST (RHSLIST as RHSLIST1)))::(_)::
4565: ((V.ID (ID as ID1)))::r672) => ((V.TRULE(
4566: map (fn {rhs,code,prec} => {lhs=ID1,rhs=rev rhs,code=code,prec=prec})
4567: RHSLIST1
4568: )),r672)
4569: | _ => raise mlyRULE 19)
4570: ::(fn (((V.TRULE (TRULE as TRULE1)))::
4571: ((V.TRULELIST (TRULELIST as TRULELIST1)))::r672) => ((
4572: V.TRULELIST(TRULE1 @ TRULELIST1)),r672)
4573: | _ => raise mlyRULE 20)
4574: ::(fn (r672) => ((V.TRULELIST(nil)),r672)
4575: )
4576: ::(fn (((V.ID (ID as ID1)))::
4577: ((V.ID_LIST (ID_LIST as ID_LIST1)))::r672) => ((V.ID_LIST(
4578: ID1 :: ID_LIST1)),r672)
4579: | _ => raise mlyRULE 22)
4580: ::(fn (r672) => ((V.ID_LIST(nil)),r672)
4581: )
4582: ::(fn (((V.PROG (PROG as PROG1)))::
4583: ((V.RULEPREC (RULEPREC as RULEPREC1)))::
4584: ((V.ID_LIST (ID_LIST as ID_LIST1)))::r672) => ((V.RHSLIST(
4585: [{rhs=ID_LIST1,code=PROG1,prec=RULEPREC1}])),r672)
4586: | _ => raise mlyRULE 24)
4587: ::(fn (((V.PROG (PROG as PROG1)))::
4588: ((V.RULEPREC (RULEPREC as RULEPREC1)))::
4589: ((V.ID_LIST (ID_LIST as ID_LIST1)))::(_)::
4590: ((V.RHSLIST (RHSLIST as RHSLIST1)))::r672) => ((V.RHSLIST(
4591: {rhs=ID_LIST1,code=PROG1,prec=RULEPREC1}::RHSLIST1)),r672)
4592: | _ => raise mlyRULE 25)
4593: ::(fn (((V.TYVAR (TYVAR as TYVAR1)))::r672) => ((V.TY([TYVAR]
4594: )),r672)
4595: | _ => raise mlyRULE 26)
4596: ::(fn ((_)::((V.RECORDLIST (RECORDLIST as RECORDLIST1)))::(_)
4597: ::r672) => ((V.TY("{ "::RECORDLIST@[" } "])),r672)
4598: | _ => raise mlyRULE 27)
4599: ::(fn ((_)::(_)::r672) => ((V.TY(["{ }"])),r672)
4600: | _ => raise mlyRULE 28)
4601: ::(fn ((_)::((V.TY (TY as TY1)))::(_)::r672) => ((V.TY(
4602: " ( "::(TY@[" ) "]))),r672)
4603: | _ => raise mlyRULE 29)
4604: ::(fn (((V.QUALID (QUALID as QUALID1)))::(_)::
4605: ((V.TYPELIST (TYPELIST as TYPELIST1)))::(_)::r672) => ((V.TY(
4606: " ( "::TYPELIST@(" ) "::QUALID))),r672)
4607: | _ => raise mlyRULE 30)
4608: ::(fn (((V.QUALID (QUALID as QUALID1)))::((V.TY (TY as TY1)))
4609: ::r672) => ((V.TY(TY@(" "::QUALID))),r672)
4610: | _ => raise mlyRULE 31)
4611: ::(fn (((V.QUALID (QUALID as QUALID1)))::r672) => ((V.TY(
4612: QUALID)),r672)
4613: | _ => raise mlyRULE 32)
4614: ::(fn (((V.TY TY2))::(_)::((V.TY (TY1)))::r672) => ((V.TY(
4615: TY1@("*"::TY2))),r672)
4616: | _ => raise mlyRULE 33)
4617: ::(fn (((V.TY TY2))::(_)::((V.TY (TY1)))::r672) => ((V.TY(
4618: TY1@(" -> "::" "::TY2))),r672)
4619: | _ => raise mlyRULE 34)
4620: ::(fn (((V.TY (TY as TY1)))::(_)::
4621: ((V.TYPELIST (TYPELIST as TYPELIST1)))::r672) => ((V.TYPELIST
4622: (TYPELIST@(","::TY))),r672)
4623: | _ => raise mlyRULE 35)
4624: ::(fn (((V.TY TY2))::(_)::((V.TY (TY1)))::r672) => ((
4625: V.TYPELIST(TY1 @ ("," :: TY2))),r672)
4626: | _ => raise mlyRULE 36)
4627: ::(fn (((V.TY (TY as TY1)))::(_)::
4628: ((V.LABEL (LABEL as LABEL1)))::(_)::
4629: ((V.RECORDLIST (RECORDLIST as RECORDLIST1)))::r672) => ((
4630: V.RECORDLIST(RECORDLIST@(" "::LABEL::" : "::TY))),r672)
4631: | _ => raise mlyRULE 37)
4632: ::(fn (((V.TY (TY as TY1)))::(_)::
4633: ((V.LABEL (LABEL as LABEL1)))::r672) => ((V.RECORDLIST(
4634: " "::LABEL::" : "::TY)),r672)
4635: | _ => raise mlyRULE 38)
4636: ::(fn (((V.ID (ID as ID1)))::r672) => ((V.QUALID([ID])),r672)
4637: | _ => raise mlyRULE 39)
4638: ::(fn (((V.QUALID (QUALID as QUALID1)))::
4639: ((V.IDDOT (IDDOT as IDDOT1)))::r672) => ((V.QUALID(
4640: IDDOT::QUALID)),r672)
4641: | _ => raise mlyRULE 40)
4642: ::(fn (((V.ID (ID as ID1)))::r672) => ((V.LABEL(ID)),r672)
4643: | _ => raise mlyRULE 41)
4644: ::(fn (((V.INT (INT as INT1)))::r672) => ((V.LABEL(INT)
4645: ),r672)
4646: | _ => raise mlyRULE 42)
4647: ::(fn (((V.ID (ID as ID1)))::(_)::r672) => ((V.RULEPREC(
4648: SOME ID1)),r672)
4649: | _ => raise mlyRULE 43)
4650: ::(fn (r672) => ((V.RULEPREC(NONE)),r672)
4651: )
4652: ::(fn ((_)::r672) => (((); V.mlyVOID),r672)
4653: | _ => raise mlyRULE 45)
4654: ::nil)
4655: in (rule_array sub i) vl end
4656: type Value = V.Value
4657: val VOID = V.mlyVOID
4658: end
4659: structure P = ParserGen(structure Lr_Table = Lr_Table
4660: structure RuleAction = R)
4661: fun parse (lex : unit -> (LexValue.V)) i=
4662: (fn (_) => ())
4663: (P.parse (fn () =>
4664: (case lex() of
4665: (LexValue.VERBOSE) => (G.T 4,V.mlyVOID)
4666: | (LexValue.VAL) => (G.T 2,V.mlyVOID)
4667: | (LexValue.UNKNOWN a) => (G.T 27,V.UNKNOWN a)
4668: | (LexValue.Term) => (G.T 32,V.mlyVOID)
4669: | (LexValue.TYVAR a) => (G.T 10,V.TYVAR a)
4670: | (LexValue.TO) => (G.T 3,V.mlyVOID)
4671: | (LexValue.STRUCT) => (G.T 5,V.mlyVOID)
4672: | (LexValue.START) => (G.T 30,V.mlyVOID)
4673: | (LexValue.RPAREN) => (G.T 8,V.mlyVOID)
4674: | (LexValue.RBRACE) => (G.T 14,V.mlyVOID)
4675: | (LexValue.PROG a) => (G.T 24,V.PROG a)
4676: | (LexValue.PREFER) => (G.T 19,V.mlyVOID)
4677: | (LexValue.PREC_TAG) => (G.T 21,V.mlyVOID)
4678: | (LexValue.PREC a) => (G.T 23,V.PREC a)
4679: | (LexValue.PERCENT_EOF) => (G.T 22,V.mlyVOID)
4680: | (LexValue.OF) => (G.T 33,V.mlyVOID)
4681: | (LexValue.Nonterm) => (G.T 31,V.mlyVOID)
4682: | (LexValue.LPAREN) => (G.T 7,V.mlyVOID)
4683: | (LexValue.LBRACE) => (G.T 15,V.mlyVOID)
4684: | (LexValue.KEYWORD) => (G.T 17,V.mlyVOID)
4685: | (LexValue.IPREFER) => (G.T 18,V.mlyVOID)
4686: | (LexValue.INT a) => (G.T 6,V.INT a)
4687: | (LexValue.IDDOT a) => (G.T 9,V.IDDOT a)
4688: | (LexValue.ID a) => (G.T 28,V.ID a)
4689: | (LexValue.HEADER a) => (G.T 20,V.HEADER a)
4690: | (LexValue.FOR) => (G.T 16,V.mlyVOID)
4691: | (LexValue.EQUAL) => (G.T 1,V.mlyVOID)
4692: | (LexValue.EOF) => (G.T 26,V.mlyVOID)
4693: | (LexValue.DELIMITER) => (G.T 34,V.mlyVOID)
4694: | (LexValue.COMMA) => (G.T 13,V.mlyVOID)
4695: | (LexValue.COLON) => (G.T 29,V.mlyVOID)
4696: | (LexValue.BLOCK) => (G.T 0,V.mlyVOID)
4697: | (LexValue.BAR) => (G.T 25,V.mlyVOID)
4698: | (LexValue.ASTERISK) => (G.T 12,V.mlyVOID)
4699: | (LexValue.ARROW) => (G.T 11,V.mlyVOID)
4700: )) i)
4701: end
4702: structure Mlex =
4703: struct
4704: structure UserDeclarations =
4705: struct
4706: open C.LexValue
4707: type lexresult = V
4708:
4709: val pcount = ref 0;
4710: val commentLevel = ref 0
4711: val lineno = C.HDR.lineno
4712: val actionstart = ref 0
4713: val eof = fn () => (if (!pcount)>0 then
4714: error " eof encountered in action beginning here !"
4715: (!actionstart)
4716: else (); EOF)
4717:
4718: val text = ref (nil : string list)
4719: val Add = fn s => (text := s::(!text))
4720: val error = C.HDR.error
4721: val inc = fn (i:int ref) => i := (!i) +1
4722:
4723: fun lookup s =
4724: let val dict = [("%prec",PREC_TAG),("%term",Term),
4725: ("%nonterm",Nonterm),("%nonassoc",PREC NONASSOC),
4726: ("%left",PREC LEFT),("%right",PREC RIGHT),
4727: ("%eof",PERCENT_EOF),("%start",START),
4728: ("%prefer",PREFER),("%insert_prefer",IPREFER),
4729: ("%keyword",KEYWORD),("%structure",STRUCT),
4730: ("%verbose",VERBOSE)]
4731:
4732: fun find ((a,d)::b) = if a=s then d else find(b)
4733: | find nil = (UNKNOWN s)
4734: in find dict
4735: end
4736:
4737: end (* end of user routines *)
4738: exception LexError (* raised if illegal leaf action tried *)
4739: structure Internal =
4740: struct
4741:
4742: datatype yyfinstate = N of int
4743: type statedata = {fin : yyfinstate list, trans: string}
4744: (* transition & final state table *)
4745: val tab = let
4746: val s0 =
4747: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4748: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4749: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4750: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4751: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4752: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4753: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4754: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4755: val s1 =
4756: "\017\017\017\017\017\017\017\017\017\017\020\017\017\017\017\017\
4757: \\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\
4758: \\017\017\017\017\017\018\017\017\017\017\017\017\017\017\017\017\
4759: \\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\
4760: \\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\
4761: \\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\
4762: \\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\
4763: \\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017"
4764: val s3 =
4765: "\021\021\021\021\021\021\021\021\021\050\052\021\021\021\021\021\
4766: \\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\
4767: \\050\021\021\021\021\047\021\045\044\021\043\021\042\040\021\021\
4768: \\038\038\038\038\038\038\038\038\038\038\037\021\021\036\021\021\
4769: \\021\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\
4770: \\025\025\025\025\025\025\025\025\025\025\025\021\021\021\021\021\
4771: \\021\025\025\025\025\025\033\025\025\025\025\025\025\025\025\031\
4772: \\025\025\025\025\025\025\028\025\025\025\025\024\023\022\021\021"
4773: val s5 =
4774: "\053\053\053\053\053\053\053\053\053\053\058\053\053\053\053\053\
4775: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4776: \\053\053\057\053\053\053\053\053\055\054\053\053\053\053\053\053\
4777: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4778: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4779: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4780: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4781: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053"
4782: val s7 =
4783: "\059\059\059\059\059\059\059\059\059\059\063\059\059\059\059\059\
4784: \\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\
4785: \\059\059\059\059\059\061\059\059\059\059\059\059\059\059\059\059\
4786: \\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\
4787: \\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\
4788: \\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\
4789: \\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\
4790: \\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059\059"
4791: val s9 =
4792: "\021\021\021\021\021\021\021\021\021\050\052\021\021\021\021\021\
4793: \\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\021\
4794: \\050\021\021\021\021\047\021\045\065\064\043\021\042\040\021\021\
4795: \\038\038\038\038\038\038\038\038\038\038\037\021\021\036\021\021\
4796: \\021\025\025\025\025\025\025\025\025\025\025\025\025\025\025\025\
4797: \\025\025\025\025\025\025\025\025\025\025\025\021\021\021\021\021\
4798: \\021\025\025\025\025\025\033\025\025\025\025\025\025\025\025\031\
4799: \\025\025\025\025\025\025\028\025\025\025\025\024\023\022\021\021"
4800: val s11 =
4801: "\066\066\066\066\066\066\066\066\066\068\070\066\066\066\066\066\
4802: \\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\
4803: \\068\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\
4804: \\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\
4805: \\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\
4806: \\066\066\066\066\066\066\066\066\066\066\066\066\067\066\066\066\
4807: \\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\
4808: \\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066\066"
4809: val s13 =
4810: "\071\071\071\071\071\071\071\071\071\071\077\071\071\071\071\071\
4811: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
4812: \\071\071\071\071\071\071\071\071\075\074\072\071\071\071\071\071\
4813: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
4814: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
4815: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
4816: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
4817: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071"
4818: val s15 =
4819: "\078\078\078\078\078\078\078\078\078\078\083\078\078\078\078\078\
4820: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\
4821: \\078\078\082\078\078\078\078\078\078\078\078\078\078\078\078\078\
4822: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\
4823: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\
4824: \\078\078\078\078\078\078\078\078\078\078\078\078\079\078\078\078\
4825: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\
4826: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078"
4827: val s18 =
4828: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4829: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4830: \\000\000\000\000\000\019\000\000\000\000\000\000\000\000\000\000\
4831: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4832: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4833: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4834: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4835: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4836: val s25 =
4837: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4838: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4839: \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\
4840: \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\
4841: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4842: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\
4843: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4844: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000"
4845: val s28 =
4846: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4847: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4848: \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\
4849: \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\
4850: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4851: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\
4852: \\000\029\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4853: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000"
4854: val s29 =
4855: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4856: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4857: \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\
4858: \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\
4859: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4860: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\
4861: \\000\026\026\026\026\026\026\026\026\026\026\026\030\026\026\026\
4862: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000"
4863: val s31 =
4864: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4865: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4866: \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\
4867: \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\
4868: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4869: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\
4870: \\000\026\026\026\026\026\032\026\026\026\026\026\026\026\026\026\
4871: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000"
4872: val s33 =
4873: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4874: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4875: \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\
4876: \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\
4877: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4878: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\
4879: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\034\
4880: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000"
4881: val s34 =
4882: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4883: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4884: \\000\000\000\000\000\000\000\026\000\000\000\000\000\000\027\000\
4885: \\026\026\026\026\026\026\026\026\026\026\000\000\000\000\000\000\
4886: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4887: \\026\026\026\026\026\026\026\026\026\026\026\000\000\000\000\026\
4888: \\000\026\026\026\026\026\026\026\026\026\026\026\026\026\026\026\
4889: \\026\026\035\026\026\026\026\026\026\026\026\000\000\000\000\000"
4890: val s38 =
4891: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4892: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4893: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4894: \\039\039\039\039\039\039\039\039\039\039\000\000\000\000\000\000\
4895: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4896: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4897: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4898: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4899: val s40 =
4900: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4901: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4902: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4903: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\041\000\
4904: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4905: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4906: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4907: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4908: val s45 =
4909: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4910: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4911: \\000\000\000\000\000\000\000\046\000\000\000\000\000\000\000\000\
4912: \\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000\000\
4913: \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\
4914: \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\046\
4915: \\000\046\046\046\046\046\046\046\046\046\046\046\046\046\046\046\
4916: \\046\046\046\046\046\046\046\046\046\046\046\000\000\000\000\000"
4917: val s47 =
4918: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4919: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4920: \\000\000\000\000\000\049\000\000\000\000\000\000\000\000\000\000\
4921: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4922: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4923: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\048\
4924: \\000\048\048\048\048\048\048\048\048\048\048\048\048\048\048\048\
4925: \\048\048\048\048\048\048\048\048\048\048\048\000\000\000\000\000"
4926: val s48 =
4927: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4928: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4929: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4930: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4931: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4932: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\048\
4933: \\000\048\048\048\048\048\048\048\048\048\048\048\048\048\048\048\
4934: \\048\048\048\048\048\048\048\048\048\048\048\000\000\000\000\000"
4935: val s50 =
4936: "\000\000\000\000\000\000\000\000\000\051\000\000\000\000\000\000\
4937: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4938: \\051\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4939: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4940: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4941: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4942: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4943: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4944: val s52 =
4945: "\000\000\000\000\000\000\000\000\000\000\052\000\000\000\000\000\
4946: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4947: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4948: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4949: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4950: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4951: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4952: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4953: val s53 =
4954: "\053\053\053\053\053\053\053\053\053\053\000\053\053\053\053\053\
4955: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4956: \\053\053\000\053\053\053\053\053\000\000\053\053\053\053\053\053\
4957: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4958: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4959: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4960: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\
4961: \\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053\053"
4962: val s55 =
4963: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4964: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4965: \\000\000\000\000\000\000\000\000\000\000\056\000\000\000\000\000\
4966: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4967: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4968: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4969: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4970: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4971: val s59 =
4972: "\060\060\060\060\060\060\060\060\060\060\000\060\060\060\060\060\
4973: \\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\
4974: \\060\060\060\060\060\000\060\060\060\060\060\060\060\060\060\060\
4975: \\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\
4976: \\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\
4977: \\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\
4978: \\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\
4979: \\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060\060"
4980: val s61 =
4981: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4982: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4983: \\000\000\000\000\000\062\000\000\000\000\000\000\000\000\000\000\
4984: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4985: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4986: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4987: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4988: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4989: val s68 =
4990: "\000\000\000\000\000\000\000\000\000\069\000\000\000\000\000\000\
4991: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4992: \\069\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4993: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4994: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4995: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4996: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
4997: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
4998: val s71 =
4999: "\071\071\071\071\071\071\071\071\071\071\000\071\071\071\071\071\
5000: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
5001: \\071\071\071\071\071\071\071\071\000\000\000\071\071\071\071\071\
5002: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
5003: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
5004: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
5005: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\
5006: \\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071\071"
5007: val s72 =
5008: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5009: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5010: \\000\000\000\000\000\000\000\000\000\073\000\000\000\000\000\000\
5011: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5012: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5013: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5014: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5015: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
5016: val s75 =
5017: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5018: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5019: \\000\000\000\000\000\000\000\000\000\000\076\000\000\000\000\000\
5020: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5021: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5022: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5023: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5024: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
5025: val s78 =
5026: "\078\078\078\078\078\078\078\078\078\078\000\078\078\078\078\078\
5027: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\
5028: \\078\078\000\078\078\078\078\078\078\078\078\078\078\078\078\078\
5029: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\
5030: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\
5031: \\078\078\078\078\078\078\078\078\078\078\078\078\000\078\078\078\
5032: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\
5033: \\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078\078"
5034: val s79 =
5035: "\000\000\000\000\000\000\000\000\000\081\081\000\000\000\000\000\
5036: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5037: \\081\000\080\000\000\000\000\000\000\000\000\000\000\000\000\000\
5038: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5039: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5040: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5041: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\
5042: \\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"
5043: in arrayoflist
5044: [{fin = [], trans = s0},
5045: {fin = [], trans = s1},
5046: {fin = [], trans = s1},
5047: {fin = [(N 39)], trans = s3},
5048: {fin = [(N 39)], trans = s3},
5049: {fin = [], trans = s5},
5050: {fin = [], trans = s5},
5051: {fin = [], trans = s7},
5052: {fin = [], trans = s7},
5053: {fin = [(N 39)], trans = s9},
5054: {fin = [(N 39)], trans = s9},
5055: {fin = [], trans = s11},
5056: {fin = [], trans = s11},
5057: {fin = [], trans = s13},
5058: {fin = [], trans = s13},
5059: {fin = [], trans = s15},
5060: {fin = [], trans = s15},
5061: {fin = [(N 1)], trans = s0},
5062: {fin = [(N 1)], trans = s18},
5063: {fin = [(N 6)], trans = s0},
5064: {fin = [(N 3)], trans = s0},
5065: {fin = [(N 78)], trans = s0},
5066: {fin = [(N 50),(N 78)], trans = s0},
5067: {fin = [(N 46),(N 78)], trans = s0},
5068: {fin = [(N 48),(N 78)], trans = s0},
5069: {fin = [(N 64),(N 78)], trans = s25},
5070: {fin = [(N 64)], trans = s25},
5071: {fin = [(N 74)], trans = s0},
5072: {fin = [(N 64),(N 78)], trans = s28},
5073: {fin = [(N 64)], trans = s29},
5074: {fin = [(N 31),(N 64)], trans = s25},
5075: {fin = [(N 64),(N 78)], trans = s31},
5076: {fin = [(N 23),(N 64)], trans = s25},
5077: {fin = [(N 64),(N 78)], trans = s33},
5078: {fin = [(N 64)], trans = s34},
5079: {fin = [(N 27),(N 64)], trans = s25},
5080: {fin = [(N 33),(N 78)], trans = s0},
5081: {fin = [(N 44),(N 78)], trans = s0},
5082: {fin = [(N 67),(N 78)], trans = s38},
5083: {fin = [(N 67)], trans = s38},
5084: {fin = [(N 78)], trans = s40},
5085: {fin = [(N 57)], trans = s0},
5086: {fin = [(N 52),(N 78)], trans = s0},
5087: {fin = [(N 54),(N 78)], trans = s0},
5088: {fin = [(N 76),(N 78)], trans = s0},
5089: {fin = [(N 70),(N 78)], trans = s45},
5090: {fin = [(N 70)], trans = s45},
5091: {fin = [(N 78)], trans = s47},
5092: {fin = [(N 61)], trans = s48},
5093: {fin = [(N 36)], trans = s0},
5094: {fin = [(N 39),(N 78)], trans = s50},
5095: {fin = [(N 39)], trans = s50},
5096: {fin = [(N 42)], trans = s52},
5097: {fin = [(N 87)], trans = s53},
5098: {fin = [(N 82)], trans = s0},
5099: {fin = [(N 80)], trans = s55},
5100: {fin = [(N 92)], trans = s0},
5101: {fin = [(N 84)], trans = s0},
5102: {fin = [(N 89)], trans = s0},
5103: {fin = [(N 9),(N 16)], trans = s59},
5104: {fin = [(N 9)], trans = s59},
5105: {fin = [(N 16)], trans = s61},
5106: {fin = [(N 12)], trans = s0},
5107: {fin = [(N 14)], trans = s0},
5108: {fin = [(N 20),(N 78)], trans = s0},
5109: {fin = [(N 18),(N 78)], trans = s0},
5110: {fin = [(N 129)], trans = s0},
5111: {fin = [(N 127),(N 129)], trans = s0},
5112: {fin = [(N 125),(N 129)], trans = s68},
5113: {fin = [(N 125)], trans = s68},
5114: {fin = [(N 122)], trans = s0},
5115: {fin = [(N 100)], trans = s71},
5116: {fin = [(N 94)], trans = s72},
5117: {fin = [(N 105)], trans = s0},
5118: {fin = [(N 94)], trans = s0},
5119: {fin = [(N 94)], trans = s75},
5120: {fin = [(N 97)], trans = s0},
5121: {fin = [(N 102)], trans = s0},
5122: {fin = [(N 110)], trans = s78},
5123: {fin = [(N 112)], trans = s79},
5124: {fin = [(N 115)], trans = s0},
5125: {fin = [(N 120)], trans = s0},
5126: {fin = [(N 107)], trans = s0},
5127: {fin = [(N 117)], trans = s0}]
5128: end
5129: structure StartStates =
5130: struct
5131: datatype yystartstate = STARTSTATE of int
5132:
5133: (* start state definitions *)
5134:
5135: val A = STARTSTATE 3;
5136: val B = STARTSTATE 5;
5137: val C = STARTSTATE 7;
5138: val COMMENT = STARTSTATE 13;
5139: val D = STARTSTATE 9;
5140: val F = STARTSTATE 11;
5141: val INITIAL = STARTSTATE 1;
5142: val STRING = STARTSTATE 15;
5143:
5144: end
5145: type result = UserDeclarations.lexresult
5146: exception LexerError (* raised if illegal leaf action tried *)
5147: end
5148:
5149: fun makeLexer yyinput : (unit -> Internal.result) =
5150: let
5151: val yyb = ref "\n" (* buffer *)
5152: val yybl = ref 1 (*buffer length *)
5153: val yypos = ref 1 (* location of next character to use *)
5154: val yydone = ref false (* eof found yet? *)
5155: val yybegin = ref 1 (*Current 'start state' for lexer *)
5156:
5157: val YYBEGIN = fn (Internal.StartStates.STARTSTATE x) =>
5158: yybegin := x
5159:
5160: fun lex () : Internal.result =
5161: let fun scan (s,AcceptingLeaves : Internal.yyfinstate list list,l,i0) =
5162: let fun action (i,nil) = raise LexError
5163: | action (i,nil::l) = action (i-1,l)
5164: | action (i,(node::acts)::l) =
5165: case node of
5166: Internal.N yyk =>
5167: (let val yytext = substring(!yyb,i0,i-i0)
5168: open UserDeclarations Internal.StartStates
5169: in (yypos := i; case yyk of
5170:
5171: (* Application actions *)
5172:
5173: 1 => (YYBEGIN C; lineno := 1; text := [yytext]; lex())
5174: | 100 => (Add yytext; lex())
5175: | 102 => (Add yytext; inc lineno; lex())
5176: | 105 => (Add yytext; dec commentLevel;
5177: if !commentLevel=0 then YYBEGIN B else (); lex())
5178: | 107 => (Add yytext; YYBEGIN B; lex())
5179: | 110 => (Add yytext; lex())
5180: | 112 => (Add yytext; lex())
5181: | 115 => (Add yytext; lex())
5182: | 117 => (Add yytext; error "unclosed string" (!lineno);
5183: inc lineno; YYBEGIN B; lex())
5184: | 12 => (YYBEGIN D; HEADER (implode (rev (!text))))
5185: | 120 => (Add yytext;
5186: if substring(yytext,1,1)="\n" then inc lineno else ();
5187: YYBEGIN F; lex())
5188: | 122 => (Add yytext; inc lineno; lex())
5189: | 125 => (Add yytext; lex())
5190: | 127 => (Add yytext; YYBEGIN STRING; lex())
5191: | 129 => (Add yytext; error "unclosed string" (!lineno);
5192: YYBEGIN B; lex())
5193: | 14 => (Add yytext; inc lineno; lex())
5194: | 16 => (Add yytext; lex())
5195: | 18 => (LPAREN)
5196: | 20 => (RPAREN)
5197: | 23 => (OF)
5198: | 27 => (FOR)
5199: | 3 => (YYBEGIN C; lineno := 2; text := [yytext]; lex())
5200: | 31 => (VAL)
5201: | 33 => (EQUAL)
5202: | 36 => (YYBEGIN A; DELIMITER)
5203: | 39 => (lex())
5204: | 42 => (lineno := !lineno + (size yytext); lex())
5205: | 44 => (COLON)
5206: | 46 => (BAR)
5207: | 48 => (LBRACE)
5208: | 50 => (RBRACE)
5209: | 52 => (COMMA)
5210: | 54 => (ASTERISK)
5211: | 57 => (ARROW)
5212: | 6 => (YYBEGIN D; HEADER "")
5213: | 61 => (lookup yytext)
5214: | 64 => (ID yytext)
5215: | 67 => (INT yytext)
5216: | 70 => (TYVAR yytext)
5217: | 74 => (IDDOT yytext)
5218: | 76 => (pcount := 1; actionstart := (!C.HDR.lineno);
5219: text := nil; YYBEGIN B; lex())
5220: | 78 => (UNKNOWN yytext)
5221: | 80 => (pcount := (!pcount) + 1; Add yytext; lex())
5222: | 82 => (pcount := (!pcount) - 1;
5223: if (!pcount = 0) then
5224: (YYBEGIN A; PROG (implode (rev (!text))))
5225: else (Add yytext; lex()))
5226: | 84 => (Add yytext; YYBEGIN STRING; lex())
5227: | 87 => (Add yytext; lex())
5228: | 89 => (Add yytext; inc lineno; lex())
5229: | 9 => (Add yytext; lex())
5230: | 92 => (Add yytext; YYBEGIN COMMENT; inc commentLevel; lex())
5231: | 94 => (Add yytext; lex())
5232: | 97 => (Add yytext; inc commentLevel; lex())
5233: | _ => raise Internal.LexerError
5234:
5235: ) end )
5236:
5237: val {fin,trans} = Internal.tab sub s
5238: val NewAcceptingLeaves = fin::AcceptingLeaves
5239: in if l = !yybl then
5240: let val newchars= if !yydone then "" else yyinput 1024
5241: in if (size newchars)=0
5242: then (yydone := true;
5243: if (l=i0) then UserDeclarations.eof()
5244: else action(l,NewAcceptingLeaves))
5245: else (if i0=l then yyb := newchars
5246: else yyb := substring(!yyb,i0,l-i0)^newchars;
5247: yybl := size (!yyb);
5248: scan (s,AcceptingLeaves,l-i0,0))
5249: end
5250: else let val NewChar = ordof(!yyb,l)
5251: val NewState = ordof(trans,NewChar)
5252: in if NewState=0 then action(l,NewAcceptingLeaves)
5253: else scan(NewState,NewAcceptingLeaves,l+1,i0)
5254: end
5255: end
5256: (*
5257: val start= if substring(!yyb,!yypos-1,1)="\n"
5258: then !yybegin+1 else !yybegin
5259: *)
5260: in scan(!yybegin (* start *),nil,!yypos,!yypos)
5261: end
5262: in lex
5263: end
5264: end
5265: structure ParseGen =
5266: struct
5267: val parseGen = fn file =>
5268: let val outfile = file ^ ".sml"
5269: val in_str = open_in file
5270: val out_str = open_out outfile
5271: val lexer = Mlex.makeLexer (input in_str)
5272: val p = (C.HDR.out := out_str; C.HDR.err_flag := false;
5273: C.HDR.infile := file; C.HDR.lineno := 0;
5274: C.parse lexer (0,0))
5275: in (close_in in_str; close_out out_str; p)
5276: end
5277: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.