|
|
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.