automate now browses the whole tree for other matches forever [done]

This commit is contained in:
xdrm-brackets 2017-05-15 04:47:11 +02:00
parent 1fbc440c58
commit 1a010ce854
2 changed files with 70 additions and 21 deletions

View File

@ -18,30 +18,55 @@ unsigned int browse(struct Automate* pAutomate, const char* pString){
=========================================================*/
unsigned int strIndex = 0; // String current char index
unsigned int recursive;
int c, len, i, l; // counters
unsigned int c, len, i, l; // counters
char* buffer = malloc(1);
char* ptr = NULL;
struct AutomateDot dotPtr;
char* pathmem = malloc( strlen(pString) ); // will contain edge number for each dot
unsigned int* indexmem = malloc( sizeof(unsigned int) * strlen(pString) ); // will contain offset of @pString for each dot
/* [1] For each char
=========================================================*/
c = 0; len = strlen(pString);
buffer = realloc(buffer, len+1);
c = 0;
len = strlen(pString);
buffer = realloc(buffer, len+1);
pAutomate->dCurrent = 0;
for( ; c < len ; c++ ){
/* (1) Initialize path memory
---------------------------------------------------------*/
for( c = 0 ; c < len ; c++ ){
pathmem[c] = 0;
indexmem[c] = 0;
}
/* (2) For each char try to match
---------------------------------------------------------*/
c = 0;
strIndex = 0;
while( c < len ){
/* (1) Check if the current char can lead to a state
---------------------------------------------------------*/
/* (1) Check current state choices */
dotPtr = pAutomate->dot[pAutomate->dCurrent];
i = 0; l = dotPtr.n;
dotPtr = pAutomate->dot[pAutomate->dCurrent];
i = pathmem[c];
l = dotPtr.n;
indexmem[c] = strIndex;
// printf("* state %d\n", pAutomate->dCurrent);
/* (2) If no more path for this branch -> exit */
if( i >= l )
break;
for( ; i < l ; i++ ){
/* (2) If STRING match */
/* (3) If STRING match */
if( dotPtr.type[i] == 0 ){
ptr = pAutomate->sedge[dotPtr.edge[i]];
@ -50,17 +75,15 @@ unsigned int browse(struct Automate* pAutomate, const char* pString){
if( strcmp(buffer, ptr) == 0 ){
pAutomate->dCurrent = dotPtr.dot[i];
strIndex += strlen(ptr);
strIndex += strlen(ptr);
}
}
/* (3) If AUTOMATE match */
else{
/* (4) If AUTOMATE match */
}else{
recursive = browse(&pAutomate->aedge[dotPtr.edge[i]], pString+strIndex);
if( pAutomate->aedge[dotPtr.edge[i]].dCurrent == pAutomate->aedge[dotPtr.edge[i]].dFinal ){
printf("rec %d from '%s'\n", recursive, pString+strIndex);
pAutomate->dCurrent = dotPtr.dot[i];
strIndex += recursive;
}
@ -69,9 +92,27 @@ unsigned int browse(struct Automate* pAutomate, const char* pString){
}
/* (5) If no more path */
if( strIndex == indexmem[c] ){
// if not first branch -> go previous
if( c > 0 )
c--;
// else next path of previous branch
strIndex = indexmem[c];
pathmem[c]++;
// printf("* back\n");
}else
c++;
}
ptr = NULL;
free(buffer);
free(pathmem);
free(indexmem);
return strIndex;

View File

@ -28,8 +28,8 @@ int main(int argc, char* argv[]){
addDot(&b);
addStringTransition(&b, "c\0");
addStringTransition(&b, "d\0");
linkSEdge(&b, 0, 0, 0);
linkSEdge(&b, 0, 1, 1);
linkSEdge(&b, 0, 0, 0); // 0-0
linkSEdge(&b, 0, 1, 1); // 0-1
// A = a+B = a+c*d
struct Automate a = createAutomate();
@ -38,14 +38,22 @@ int main(int argc, char* argv[]){
addDot(&a);
addStringTransition(&a, "a\0");
addAutomateTransition(&a, &b);
linkSEdge(&a, 0, 1, 0);
linkSEdge(&a, 1, 1, 0);
linkAEdge(&a, 1, 2, 0);
linkSEdge(&a, 0, 1, 0); // 0-0
linkSEdge(&a, 1, 1, 0); // 1-0
linkAEdge(&a, 1, 2, 0); // 1-1
printf("browse 'acd' : %d ; finalState = %d\n", browse(&a, "acd"), a.dCurrent);
printf("browse 'ad' : %d ; finalState = %d\n", browse(&a, "ad"), a.dCurrent);
printf("browse 'acccd' : %d ; finalState = %d\n", browse(&a, "acccd"), a.dCurrent);
printf("browse 'aaaacccd' : %d ; finalState = %d\n", browse(&a, "aaaacccd"), a.dCurrent);
printf("browse 'acd' : %d\n", browse(&a, "acd"));
printf("* final_state: %d\n", a.dCurrent);
printf("browse 'ad' : %d\n", browse(&a, "ad"));
printf("* final_state: %d\n", a.dCurrent);
printf("browse 'aad' : %d\n", browse(&a, "aad"));
printf("* final_state: %d\n", a.dCurrent);
printf("browse 'acccd' : %d\n", browse(&a, "acccd"));
printf("* final_state: %d\n", a.dCurrent);
printf("browse 'aaaacccd' : %d\n", browse(&a, "aaaacccd"));
printf("* final_state: %d\n", a.dCurrent);
printf("browse 'aaaaccc' : %d\n", browse(&a, "aaaaccc"));
printf("* final_state: %d\n", a.dCurrent);
/* Build RegExp */
// char regex[40] = "(a([abc](b+a)(b+e)+ahd)*(b+i)c)sd";