|
|
1.1 root 1: # PATTERNS(2)
2: #
3: # SNOBOL4-style pattern matching
4: #
5: # Ralph E. Griswold
6: #
7: # Last modified 7/27/83
8: #
9:
10: global Mode, Float
11:
12: procedure Anchor() # &ANCHOR = 1
13: suspend ""
14: end
15:
16: procedure Any(s) # ANY(S)
17: suspend tab(any(s))
18: end
19:
20: procedure Apply(s,p) # S ? P
21: local tsubject, tpos, value
22: initial {
23: Float := Arb
24: /Mode := Float # &ANCHOR = 0 if not already set
25: }
26: suspend (
27: (tsubject := &subject) &
28: (tpos := &pos) &
29: (&subject <- s) &
30: (&pos <- 1) &
31: (Mode() & (value := p())) &
32: (&pos <- tpos) & # to restore on backtracking
33: (&subject <- tsubject) & # note this sets &pos
34: (&pos <- tpos) & # to restore on evaluation
35: value
36: )
37: end
38:
39: procedure Arb() # ARB
40: suspend tab(&pos to *&subject + 1)
41: end
42:
43: procedure Arbno(p) # ARBNO(P)
44: suspend "" | (p() || Arbno(p))
45: end
46:
47: procedure Arbx(i) # ARB(I)
48: suspend tab(&pos to *&subject + 1 by i)
49: end
50:
51: procedure Bal() # BAL
52: suspend Bbal() || Arbno(Bbal)
53: end
54:
55: procedure Bbal() # used by Bal()
56: suspend (="(" || Arbno(Bbal) || =")") | Notany("()")
57: end
58:
59: procedure Break(s) # BREAK(S)
60: suspend tab(upto(s) \ 1)
61: end
62:
63: procedure Breakx(s) # BREAKX(S)
64: suspend tab(upto(s))
65: end
66:
67: procedure Cat(p1,p2) # P1 P2
68: suspend p1() || p2()
69: end
70:
71: procedure Discard(p) # /P
72: suspend p() & ""
73: end
74:
75: procedure Exog(s) # \S
76: suspend s
77: end
78:
79: procedure Find(s) # FIND(S)
80: suspend tab(find(s) + 1)
81: end
82:
83: procedure Len(i) # LEN(I)
84: suspend move(i)
85: end
86:
87: procedure Limit(p,i) # P \ i
88: local j
89: j := &pos
90: suspend p() \ i
91: &pos := j
92: end
93:
94: procedure Locate(p) # LOCATE(P)
95: suspend tab(&pos to *&subject + 1) & p()
96: end
97:
98: procedure Marb() # max-first ARB
99: suspend tab(*&subject + 1 to &pos by -1)
100: end
101:
102: procedure Notany(s) # NOTANY(S)
103: suspend tab(any(~s))
104: end
105:
106: procedure Pos(i) # POS(I)
107: suspend pos(i + 1) & ""
108: end
109:
110: procedure Replace(p,s) # P = S
111: suspend p() & s
112: end
113:
114: procedure Rpos(i) # RPOS(I)
115: suspend pos(-i) & ""
116: end
117:
118: procedure Rtab(i) # RTAB(I)
119: suspend tab(-i)
120: end
121:
122: procedure Span(s) # SPAN(S)
123: suspend tab(many(s))
124: end
125:
126: procedure String(s) # S
127: suspend =s
128: end
129:
130: procedure Succeed() # SUCCEED
131: suspend |""
132: end
133:
134: procedure Tab(i) # TAB(I)
135: suspend tab(i + 1)
136: end
137:
138: procedure Xform(f,p) # F(P)
139: suspend f(p())
140: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.