Annotation of 43BSD/contrib/icon/book/20/rsg1.icn, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.