Annotation of 43BSD/contrib/icon/book/20/rsg1.icn, revision 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.