BSD 4_3 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Fri, 4 Mar 1983 00:35:39 +0000 (16:35 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Fri, 4 Mar 1983 00:35:39 +0000 (16:35 -0800)
Work on file usr/contrib/icon/book/20/rsg1.icn

Synthesized-from: CSRG/cd1/4.3

usr/contrib/icon/book/20/rsg1.icn [new file with mode: 0644]

diff --git a/usr/contrib/icon/book/20/rsg1.icn b/usr/contrib/icon/book/20/rsg1.icn
new file mode 100644 (file)
index 0000000..431d0fe
--- /dev/null
@@ -0,0 +1,54 @@
+global defs
+
+record nonterm(name)
+
+procedure main()
+   local line
+   defs := table()
+   while line := read() do
+      (define | generate)(line)
+end
+
+procedure define(line)
+   return line ?
+      defs[(="<",tab(find(">::=")))] := (move(4),alts(tab(0)))
+end
+
+procedure alts(defn)
+   local alist
+   alist := []
+   defn ? while put(alist,syms(tab(many(~'|')))) do move(1)
+   return alist
+end
+
+procedure syms(alt)
+   local slist
+   slist := []
+   alt ? while put(slist,tab(many(~'<')) |
+      nonterm(2(="<",tab(upto('>')),move(1))))
+   return slist
+end
+
+procedure generate(line)
+   local goal, count
+   line ? {
+      ="<" &
+      goal := tab(upto('>')) &
+      move(1) &
+      count := tab(0)
+      }
+   every write(gener(goal)) \ count
+   return
+end
+
+procedure gener(goal)
+   local pending, genstr, symbol
+   repeat {
+      pending := [nonterm(goal)]
+      genstr := ""
+      while symbol := get(pending) do
+         if type(symbol) == "string" then genstr ||:= symbol
+         else pending := ?defs[symbol.name] ||| pending
+      suspend genstr
+      }
+end