Mercurial > hg > Applications > Grep
comparison c/regexParser/main.cc @ 68:d27b3af1fe75
remove string()
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 11 Aug 2015 19:46:33 +0900 |
parents | 4842ca2cf8ee |
children | eecddded9b91 |
comparison
equal
deleted
inserted
replaced
67:4842ca2cf8ee | 68:d27b3af1fe75 |
---|---|
1 /* | 1 /* |
2 * <literal> ::= [a-z][A-Z][0-9] | 2 * <literal> ::= [a-z][A-Z][0-9] |
3 * <charClass> ::= '['<literal>'-'<literal>']' | 3 * <charClass> ::= '['<literal>'-'<literal>']' |
4 * <string> ::= <literal><literal>* | |
5 * <group> ::= '('<regex>')' | 4 * <group> ::= '('<regex>')' |
6 * <regexAtom> ::= <literal>|<charClass>|<group> | 5 * <regexAtom> ::= <literal>|<charClass>|<group> |
7 * <regex> ::= <regexAtom>|<regexAtom>'*'|<regexAtom>'|'<regex>|<regexAtom><regex> | 6 * <regex> ::= <regexAtom>|<regexAtom>'*'|<regexAtom>'|'<regex>|<regexAtom><regex> |
8 */ | 7 */ |
9 | 8 |
25 union value { | 24 union value { |
26 charClass *cc; | 25 charClass *cc; |
27 unsigned char character; | 26 unsigned char character; |
28 } Value, *ValuePtr; | 27 } Value, *ValuePtr; |
29 struct node *self; | 28 struct node *self; |
29 struct node *parent; | |
30 struct node *left; | 30 struct node *left; |
31 struct node *right; | 31 struct node *right; |
32 } Node, *NodePtr; | 32 } Node, *NodePtr; |
33 | 33 |
34 unsigned char *ptr; | 34 unsigned char *ptr; |
35 unsigned char tokenType; | 35 unsigned char tokenType; |
36 int tokenValue; | 36 int tokenValue; |
37 NodePtr regexHeadNode; | 37 NodePtr regexHeadNode; |
38 | 38 |
39 NodePtr charClass(); | 39 NodePtr charClass(); |
40 NodePtr string(); | |
41 NodePtr group(); | 40 NodePtr group(); |
42 NodePtr orexp(); | 41 NodePtr orexp(); |
43 NodePtr asterisk(); | 42 NodePtr asterisk(); |
44 NodePtr regex(); | 43 NodePtr regex(); |
45 NodePtr createNode(unsigned char,NodePtr,NodePtr); | 44 NodePtr createNode(unsigned char,NodePtr,NodePtr); |
92 | 91 |
93 // <literal> ::= [a-z][A-Z][0-9] | 92 // <literal> ::= [a-z][A-Z][0-9] |
94 NodePtr literal() { | 93 NodePtr literal() { |
95 NodePtr n = createNode(*ptr,0,0); | 94 NodePtr n = createNode(*ptr,0,0); |
96 ptr++; | 95 ptr++; |
97 return n; | |
98 } | |
99 | |
100 // <string> ::= <literal><literal>* | |
101 NodePtr string() { | |
102 char c = *ptr; | |
103 NodePtr n = NULL; | |
104 if (isLiteral(c)) { | |
105 n = createNode(0,literal(),string()); | |
106 } else { | |
107 n = createNode(0,0,0); | |
108 } | |
109 return n; | 96 return n; |
110 } | 97 } |
111 | 98 |
112 // <group> ::= '('<regex>')' | 99 // <group> ::= '('<regex>')' |
113 NodePtr group() { | 100 NodePtr group() { |
191 } else { | 178 } else { |
192 NodePtr n1 = regex(); | 179 NodePtr n1 = regex(); |
193 n = createNode('+',n,n1); | 180 n = createNode('+',n,n1); |
194 } | 181 } |
195 } return n; | 182 } return n; |
196 } | 183 } |
197 /* | 184 /* |
198 * e.g. | 185 * e.g. |
199 * | 186 * |
200 * % ./regexParser -regex abc | 187 * % ./regexParser -regex abc |
201 * | 188 * c |
202 * #-c | 189 * + |
203 * #-+ | 190 * b |
204 * # #-b | |
205 * + | 191 * + |
206 * #-a | 192 * a |
207 * | 193 * |
208 * % ./regexParser -regex (a*|bc)d | 194 * % ./regexParser -regex (a*|bc)d |
209 * | 195 * |
210 * | 196 * d |
211 * #-d | |
212 * + | 197 * + |
213 * # #-c | 198 * c |
214 * # #-+ | 199 * + |
215 * # # #-b | 200 * b |
216 * #-| | 201 * | |
217 * # | 202 * * |
218 * #-* | 203 * a |
219 * #-a | |
220 * | |
221 */ | 204 */ |
205 | |
206 void descendTree(NodePtr n,int d) { | |
207 if (n->right != NULL) { | |
208 d++; | |
209 descendTree(n->right, d); | |
210 } else if (n->left != NULL) { | |
211 d++; | |
212 descendTree(n->right, d); | |
213 } else { | |
214 printf("%c\n",n->Value.character); | |
215 } | |
216 } | |
217 | |
222 void printTree(NodePtr n) { | 218 void printTree(NodePtr n) { |
223 | 219 int depth = 0; |
220 descendTree(n,depth); | |
224 } | 221 } |
225 | 222 |
226 | 223 |
227 int main(int argc, char **argv) | 224 int main(int argc, char **argv) |
228 { | 225 { |