# HG changeset patch # User Masataka Kohagura # Date 1448894633 -32400 # Node ID 188d866227a4299f38dd17ec7f4543077564ecde # Parent aa266a4db47c011e7cbd0cbc5a744f8311e6cc50 fix diff -r aa266a4db47c -r 188d866227a4 c/regexParser/regexParser.cc --- a/c/regexParser/regexParser.cc Thu Nov 26 21:17:26 2015 +0900 +++ b/c/regexParser/regexParser.cc Mon Nov 30 23:43:53 2015 +0900 @@ -1,5 +1,7 @@ #include #include +#include +#include #include "regexParser.h" #include "error.h" @@ -42,7 +44,6 @@ if (ri->tokenType == 'a') { ri->tokenType = 0; n->cc->cond->w = getWord(ri->tokenValue); - ri->ptr += n->cc->cond->w->length-1; } else { WordPtr w = (WordPtr)malloc(sizeof(Word)); w->word = character; @@ -55,13 +56,31 @@ // ::= '[''-'']' static NodePtr charClass(RegexInfoPtr ri) { - NodePtr n = (NodePtr)malloc(sizeof(Node)); + NodePtr n = allocateNode(); if (n == NULL) { mallocFailedMessage(); } - while (ri->ptr[0] == '-') { - ri->ptr++; + + n->tokenType = ri->tokenType; + n->nodeNumber = ri->nodeNumber; + ri->nodeNumber++; + n->cc->cond->w = (WordPtr)malloc(sizeof(Word)); + + int i = 0; + + while (ri->ptr[i] != ']') { + if (ri->ptr[i] == '-') { + n->cc->begin = ri->ptr[i-1]; + n->cc->end = ri->ptr[i+1]; + } + i++; } + + n->cc->cond->w->word = (unsigned char*)malloc(sizeof(unsigned char)*(i+1)); + strncpy((char*)n->cc->cond->w->word, (char*)ri->ptr,i+1); + n->cc->cond->w->word[i] = '\0'; + ri->ptr += i+1; + return n; } @@ -96,7 +115,7 @@ return; } else if (ri->ptr[0] == '[') { ri->ptr++; - ri->tokenType = '['; + ri->tokenType = 'c'; ri->tokenValue = ri->ptr; if (ri->ptr[1] == ']') { ri->ptr++; @@ -124,7 +143,9 @@ } else { ri->tokenType = 'a'; ri->tokenValue = ri->ptr; - ri->ptr++; + while (isalnum(ri->ptr[0])) { + ri->ptr++; + } return; } } @@ -138,13 +159,13 @@ token(ri); NodePtr n = NULL; if (ri->tokenType == 'a') n = literal(ri); - else if (ri->tokenType == '[') n = charClass(ri); + else if (ri->tokenType == 'c') n = charClass(ri); else if (ri->tokenType == '(') n = group(ri); return n; } -// ::= |'*'|'|'| +// ::= | '*' | '*' | '|' | | '(' regex ')' NodePtr regex(RegexInfoPtr ri) { NodePtr n = regexAtom(ri); while (ri->ptr[0]) { diff -r aa266a4db47c -r 188d866227a4 c/regexParser/regexParser.h --- a/c/regexParser/regexParser.h Thu Nov 26 21:17:26 2015 +0900 +++ b/c/regexParser/regexParser.h Mon Nov 30 23:43:53 2015 +0900 @@ -15,8 +15,8 @@ ConditionList cond; struct charClass *left; struct charClass *right; - unsigned long *begin; - unsigned long *end; + unsigned char begin; + unsigned char end; } CharClass, *CharClassPtr; typedef struct node {