|
|
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.