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