Mercurial > hg > Applications > Grep
comparison c/regexParser/main.cc @ 57:71b497d25273
fix literal()
author | Masataka Kohagura <kohagura@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 11 Jun 2015 19:50:02 +0900 |
parents | 8901bc071d33 |
children | 4053c3e0fa7f |
comparison
equal
deleted
inserted
replaced
56:8901bc071d33 | 57:71b497d25273 |
---|---|
8 */ | 8 */ |
9 | 9 |
10 #include <stdio.h> | 10 #include <stdio.h> |
11 #include <stdlib.h> | 11 #include <stdlib.h> |
12 #include <string.h> | 12 #include <string.h> |
13 | |
13 char *ptr; | 14 char *ptr; |
14 | |
15 typedef struct node { | 15 typedef struct node { |
16 int character; | 16 char character; |
17 struct node *left; | 17 struct node *left; |
18 struct node *right; | 18 struct node *right; |
19 } Node, *NodePtr; | 19 } Node, *NodePtr; |
20 | 20 |
21 NodePtr charClass(); | 21 NodePtr charClass(); |
22 NodePtr string(); | 22 NodePtr string(); |
23 NodePtr _or(); | 23 NodePtr _or(); |
24 NodePtr asterisk(); | 24 NodePtr asterisk(); |
25 NodePtr regex(); | 25 NodePtr regex(); |
26 NodePtr createNode(int,NodePtr,NodePtr); | 26 NodePtr createNode(char,NodePtr,NodePtr); |
27 | 27 |
28 NodePtr createNode(int character, NodePtr left, NodePtr right) { | 28 NodePtr createNode(char character, NodePtr left, NodePtr right) { |
29 NodePtr n; | 29 NodePtr n = (NodePtr)malloc(sizeof(Node)); |
30 n = (NodePtr)malloc(sizeof(Node)); | |
31 n->character = character; | 30 n->character = character; |
32 n->left = left; | 31 n->left = left; |
33 n->right = right; | 32 n->right = right; |
34 return n; | 33 return n; |
35 } | 34 } |
41 } | 40 } |
42 | 41 |
43 // <literal> ::= [a-z][A-Z][0-9] | 42 // <literal> ::= [a-z][A-Z][0-9] |
44 NodePtr literal() { | 43 NodePtr literal() { |
45 char c = *ptr; | 44 char c = *ptr; |
46 createNode(c,0,0); | 45 NodePtr n = createNode(c,0,0); |
46 ptr++; | |
47 return n; | |
47 } | 48 } |
48 | 49 |
49 // <string> ::= <literal><literal>* | 50 // <string> ::= <literal><literal>* |
50 NodePtr string() { | 51 NodePtr string() { |
51 char c = *ptr; | 52 char c = *ptr; |
52 NodePtr n = (NodePtr)malloc(sizeof(Node)); | 53 NodePtr n; |
53 | 54 |
54 if (('a'<=c && c<='z')||('A'<=c && c<='Z')||('0'<=c && c<='9')) { | 55 if (('a'<=c && c<='z')||('A'<=c && c<='Z')||('0'<=c && c<='9')) { |
55 n = createNode(0,literal(),string()); | 56 n = createNode(0,literal(),string()); |
56 return n; | 57 return n; |
57 } else { | 58 } else { |
79 // <literal> は <string> に内包されるから、<regex> ::= <string>|<or>|<charClass>が正しい?? | 80 // <literal> は <string> に内包されるから、<regex> ::= <string>|<or>|<charClass>が正しい?? |
80 NodePtr regex() { | 81 NodePtr regex() { |
81 | 82 |
82 NodePtr n; | 83 NodePtr n; |
83 | 84 |
84 while (int c = *ptr++) { | 85 while (char c = *ptr) { |
85 if (c == '(') { | 86 if (c == '(') { |
86 ptr++; | 87 ptr++; |
87 _or(); | 88 n = _or(); |
88 } else if (c == '[') { | 89 } else if (c == '[') { |
89 charClass(); | 90 n = charClass(); |
90 } else { | 91 } else { |
91 n = createNode(0,string(),regex()); | 92 n = string(); |
92 } | 93 } |
94 ptr++; | |
93 } | 95 } |
94 | 96 |
95 return n; | 97 return n; |
96 } | 98 } |
97 | 99 |