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 {