comparison pattern.rhope @ 108:a7add4db4a25

Improved implementation of Pattern
author Mike Pavone <pavone@retrodev.com>
date Wed, 06 Oct 2010 23:46:47 +0000
parents
children d86df83402f3
comparison
equal deleted inserted replaced
104:2d2da148d844 108:a7add4db4a25
1
2 Blueprint Empty Pattern
3 {
4 }
5
6 Empty Pattern[:out]
7 {
8 out <- Build[Empty Pattern()]
9 }
10
11 Add String@Empty Pattern[pattern,string,idx:out]
12 {
13 out <- [pattern]_Add String[string,0,idx]
14 }
15
16 _Add String@Empty Pattern[pattern,string,n,idx:out]
17 {
18 If[[n]<[[string]Byte Length]]
19 {
20 out <- [[[[[[Build[Pattern()]
21 ]Byte <<[[string]Byte[n]]
22 ]Left <<[pattern]
23 ]Right <<[pattern]
24 ]Straight <<[[pattern]_Add String[string, [n]+[1],idx]]
25 ]Terminal? <<[[n]=[[[string]Byte Length]-[1]]]
26 ]Index <<[idx]
27 }{
28 out <- pattern
29 }
30 }
31
32 Blueprint Pattern
33 {
34 Byte
35 Left
36 Right
37 Straight
38 Terminal?
39 Index
40 }
41
42 _Add String@Pattern[pattern,string,n,idx:out]
43 {
44 If[[n]<[[string]Byte Length]]
45 {
46 b <- [string]Byte[n]
47 myb <- [pattern]Byte >>
48 If[[b]<[myb]]
49 {
50 out <- [pattern]Left <<[[[pattern]Left >>]_Add String[string,n,idx]]
51 }{
52 If[[b]>[myb]]
53 {
54 out <- [pattern]Right <<[[[pattern]Right >>]_Add String[string,n,idx]]
55 }{
56 newpat <- [pattern]Straight <<[[[pattern]Straight >>]_Add String[string,[n]+[1],idx]]
57 If[[n]=[[[string]Byte Length]-[1]]]
58 {
59 out <- [newpat]Terminal? <<[Yes]
60 }{
61 out <- Val[newpat]
62 }
63 }
64 }
65 }{
66 out <- pattern
67 }
68 }
69
70 Add String@Pattern[pattern,string,idx:out]
71 {
72 out <- [pattern]_Add String[string,0,idx]
73 }
74
75 Pattern@List[list:out]
76 {
77 out <- Fold[Add String[?], Empty Pattern[], list]
78 }
79
80 Pattern@List Leaf[list:out]
81 {
82 out <- Fold[Add String[?], Empty Pattern[], list]
83 }
84
85 Pattern@Pattern[p:out]
86 {
87 out <- p
88 }
89
90
91 _Match@Empty Pattern[pattern,string,n:num,no match]
92 {
93 no match <- Yes
94 }
95
96 Match@Empty Pattern[pattern,string:num,no match]
97 {
98 no match <- Yes
99 }
100
101 Match@Pattern[pattern,string:num,no match,idx]
102 {
103 num,no match,idx <- [pattern]_Match[string,0]
104 }
105
106 _Match@Pattern[pattern,string,n:num,no match,idx]
107 {
108 b <- [string]Byte[n]
109 myb <- [pattern]Byte >>
110 If[[b]=[myb]]
111 {
112 num, ,idx <- [[pattern]Straight >>]_Match[string, [n]+[1]] { }
113 {
114 ,no match <- If[[pattern]Terminal? >>]
115 {
116 num <- [n]+[1]
117 idx <- Index >>[pattern]
118 }
119 }
120
121 }{
122 If[[b]<[myb]]
123 {
124 num, no match, idx <- [[pattern]Left >>]_Match[string, n]
125 }{
126 num, no match, idx <- [[pattern]Right >>]_Match[string, n]
127 }
128 }
129 }
130