Mercurial > repos > rhope
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 |