|
|
1.1 root 1: # CSGEN(1)
2: #
3: # Generate instances of sentences defined by context-sensitive
4: # grammars
5: #
6: # Ralph E. Griswold
7: #
8: # Last modified 4/27/83
9: #
10:
11: global xlist
12:
13: procedure main(x)
14: local line, goal, count, s
15: while line := read() do # read in grammar
16: if xpairs(line) then next
17: else {
18: line ? (goal := move(1),move(1),count := (0 < integer(tab(0))))
19: break
20: }
21: every 1 to count do { # generate sentences
22: s := goal
23: while upto(&ucase,s) do { # test for nonterminal
24: if x[1] == "-t" then write(&errout,s)
25: # quit on deadlock
26: if not(s ? replace(!xlist)) then break next
27: until s ?:= replace(?xlist) # make replacement
28: }
29: write(s)
30: }
31: end
32:
33: # replace left hand side by right hand side
34: #
35: procedure replace(a)
36: suspend tab(find(a[1])) || (move(*a[1]),a[2]) || tab(0)
37: end
38:
39: # enter rewriting rule
40: #
41: procedure xpairs(s)
42: local i, a
43: initial xlist := []
44: if s ? {
45: # handle optional replication factor
46: i := 1(0 < integer(tab(upto(':'))),move(1)) | 1 &
47: a := [tab(find("->")),(move(2),tab(0))]
48: }
49: then {
50: every 1 to i do put(xlist,a)
51: return
52: }
53: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.