|
|
1.1 root 1: global defs
2:
3: record nonterm(name)
4:
5: procedure main()
6: local line
7: defs := table()
8: while line := read() do
9: (define | generate)(line)
10: end
11:
12: procedure define(line)
13: return line ?
14: defs[(="<",tab(find(">::=")))] := (move(4),alts(tab(0)))
15: end
16:
17: procedure alts(defn)
18: local alist
19: alist := []
20: defn ? while put(alist,syms(tab(many(~'|')))) do move(1)
21: return alist
22: end
23:
24: procedure syms(alt)
25: local slist
26: slist := []
27: alt ? while put(slist,tab(many(~'<')) |
28: nonterm(2(="<",tab(upto('>')),move(1))))
29: return slist
30: end
31:
32: procedure generate(line)
33: local goal, count
34: line ? {
35: ="<" &
36: goal := tab(upto('>')) &
37: move(1) &
38: count := tab(0)
39: }
40: every write(gener(goal)) \ count
41: return
42: end
43:
44: procedure gener(goal)
45: local pending, genstr, symbol
46: repeat {
47: pending := [nonterm(goal)]
48: genstr := ""
49: while symbol := get(pending) do
50: if type(symbol) == "string" then genstr ||:= symbol
51: else pending := ?defs[symbol.name] ||| pending
52: suspend genstr
53: }
54: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.