json test

This commit is contained in:
xdrm-brackets 2017-05-15 18:04:42 +02:00
parent a66ea3fe14
commit e2c1929360
1 changed files with 93 additions and 36 deletions

View File

@ -25,64 +25,121 @@ int main(int argc, char* argv[]){
struct Automate digit = createAutomate("digit"); struct Automate digit = createAutomate("digit");
addDot(&digit); // q0 addDot(&digit); // q0
addDot(&digit); // q1 addDot(&digit); // q1
addRangeTransition(&digit, "09\0"); // r0 addRangeTransition(&digit, "19\0"); // r0
linkDots(&digit, 0, 0, RANGE_T, 0); // q0 --r0--> q0 addRangeTransition(&digit, "09\0"); // r1
linkDots(&digit, 0, 1, RANGE_T, 0); // q0 --r0--> q1 linkDots(&digit, 0, 1, RANGE_T, 0); // q0 --r0--> q1
linkDots(&digit, 1, 1, RANGE_T, 1); // q1 --r1--> q1
struct Automate positive = createAutomate("positive");
addDot(&positive); // q0
addDot(&positive); // q1
addDot(&positive); // q2
addDot(&positive); // q3
addStringTransition(&positive, ",\0"); // s0
addAutomateTransition(&positive, &digit); // a0
linkDots(&positive, 0, 1, AUTOMATE_T, 0); // q0 --a0--> q1
linkDots(&positive, 0, 2, STRING_T, 0); // q0 --s0--> q2
linkDots(&positive, 0, 3, AUTOMATE_T, 0); // q0 --a0--> q3
linkDots(&positive, 1, 2, STRING_T, 0); // q1 --s0--> q2
linkDots(&positive, 1, 3, STRING_T, 0); // q1 --s0--> q3
linkDots(&positive, 2, 3, AUTOMATE_T, 0); // q2 --a0--> q3
// A = a+(bc[x-z]+bc[de])
struct Automate number = createAutomate("number"); struct Automate number = createAutomate("number");
addDot(&number); // q0 addDot(&number); // q0
addDot(&number); // q1 addDot(&number); // q1
addDot(&number); // q2 addDot(&number); // q2
addDot(&number); // q3
addDot(&number); // q4
addStringTransition(&number, ".\0"); // s0
addListTransition(&number, "+-\0"); // l0 addListTransition(&number, "+-\0"); // l0
addAutomateTransition(&number, &positive); // a0 addAutomateTransition(&number, &digit); // a0
linkDots(&number, 0, 1, DIRECT_T, 0); // q0 --d0--> q1
linkDots(&number, 0, 1, LIST_T, 0); // q0 --l0--> q1 linkDots(&number, 0, 1, LIST_T, 0); // q0 --l0--> q1
linkDots(&number, 0, 2, AUTOMATE_T, 0); // q0 --a0--> q2
linkDots(&number, 1, 2, AUTOMATE_T, 0); // q1 --a0--> q2 linkDots(&number, 1, 2, AUTOMATE_T, 0); // q1 --a0--> q2
linkDots(&number, 1, 3, STRING_T, 0); // q1 --s0--> q3
linkDots(&number, 1, 4, AUTOMATE_T, 0); // q1 --a0--> q4
linkDots(&number, 2, 3, STRING_T, 0); // q2 --a0--> q3
linkDots(&number, 2, 4, STRING_T, 0); // q2 --s0--> q4
linkDots(&number, 3, 4, AUTOMATE_T, 0); // q4 --a0--> q4
mergeAutomate(&number, 0);
mergeAutomate(&positive, 0); struct Automate alphanum = createAutomate("alphanum");
debug(positive); addDot(&alphanum); // q0
addDot(&alphanum); // q1
addRangeTransition(&alphanum, "az\0"); // r0
addRangeTransition(&alphanum, "AZ\0"); // r1
addRangeTransition(&alphanum, "09\0"); // r2
addListTransition(&alphanum, "-_\0"); // l0
linkDots(&alphanum, 0, 1, LIST_T, 0); // q0 --l0--> q1
linkDots(&alphanum, 0, 1, RANGE_T, 0); // q0 --r0--> q1
linkDots(&alphanum, 0, 1, RANGE_T, 1); // q0 --r1--> q1
linkDots(&alphanum, 0, 1, RANGE_T, 2); // q0 --r2--> q1
// mergeAutomate(&number, 0);
// debug(number);
// mergeAutomate(&number, 0); struct Automate escapable = createAutomate("escapable");
addDot(&escapable); // q0
addDot(&escapable); // q1
addListTransition(&escapable, "\"\\/bfnrt\0"); // r0
linkDots(&escapable, 0, 1, RANGE_T, 0); // q0 --r0--> q1
char string[40] = {0}; struct Automate string = createAutomate("string");
addDot(&string); // q0
addDot(&string); // q1
addDot(&string); // q2
addDot(&string); // q3
addStringTransition(&string, "\"\0"); // s0
addStringTransition(&string, "\\\0"); // s1
addAutomateTransition(&string, &alphanum); // a0
addAutomateTransition(&string, &escapable); // a1
linkDots(&string, 0, 1, STRING_T, 0); // q0 --s0--> q1
linkDots(&string, 1, 1, AUTOMATE_T, 0); // q1 --a0--> q1
linkDots(&string, 1, 2, STRING_T, 1); // q1 --s1--> q2
linkDots(&string, 2, 1, AUTOMATE_T, 1); // q2 --a1--> q1
linkDots(&string, 1, 3, STRING_T, 0); // q1 --s0--> q3
mergeAutomate(&string, 1);
mergeAutomate(&string, 0);
struct Automate value = createAutomate("value");
addDot(&value); // q0
addDot(&value); // q1
addStringTransition(&value, "null\0"); // s0
addStringTransition(&value, "true\0"); // s1
addStringTransition(&value, "false\0"); // s2
addAutomateTransition(&value, &number); // a0
addAutomateTransition(&value, &string); // a1
linkDots(&value, 0, 1, STRING_T, 0); // q0 --s0--> q1
linkDots(&value, 0, 1, STRING_T, 1); // q0 --s1--> q1
linkDots(&value, 0, 1, STRING_T, 2); // q0 --s2--> q1
linkDots(&value, 0, 1, AUTOMATE_T, 0); // q0 --a0--> q1
linkDots(&value, 0, 1, AUTOMATE_T, 1); // q0 --a1--> q1
mergeAutomate(&value, 1);
mergeAutomate(&value, 0);
struct Automate array = createAutomate("array");
addDot(&array); // q0
addDot(&array); // q1
addDot(&array); // q2
addDot(&array); // q3
addStringTransition(&array, "[\0"); // s0
addStringTransition(&array, "]\0"); // s1
addStringTransition(&array, ",\0"); // s2
addAutomateTransition(&array, &value); // a0
linkDots(&array, 0, 1, STRING_T, 0); // q0 --s0--> q1
linkDots(&array, 1, 2, AUTOMATE_T, 0); // q1 --a0--> q2
linkDots(&array, 2, 1, STRING_T, 2); // q2 --s2--> q1
linkDots(&array, 1, 3, STRING_T, 1); // q1 --s1--> q3
mergeAutomate(&array, 0);
// debug(array);
char str[40] = {0};
unsigned int browsed = 0; unsigned int browsed = 0;
clock_t start, stop; clock_t start, stop;
strcpy(string, "123,4\0"); strcpy(str, "[\"abc\"]\0");
start = clock(); browsed = browse(&positive, string, 0); stop = clock(); start = clock(); browsed = browse(&array, str, 0); stop = clock();
printf("browse '%s' : %d/%d\n", string, browsed, (int) strlen(string)); printf("browse '%s' : %d/%d\n", str, browsed, (int) strlen(str));
printf(" (*) final_state: %d/%d\n", positive.dCurrent, positive.dFinal); printf(" (*) final_state: %d/%d\n", array.dCurrent, array.dFinal);
printf(" (*) in %d steps\n", positive.steps); printf(" (*) in %d steps\n", array.steps);
printf(" (*) in %.3lf seconds\n\n", (double)(stop-start)/CLOCKS_PER_SEC); printf(" (*) in %.3lf seconds\n\n", (double)(stop-start)/CLOCKS_PER_SEC);
for( c = 0 ; c < positive.n ; c++ ){ for( c = 0 ; c < array.n ; c++ ){
if( c > 0 ) if( c > 0 )
printf(" -> "); printf(" -> ");
printf("q%d", positive.path[c]); printf("q%d", array.path[c]);
} }
printf(" -> q%d\n", positive.dFinal); printf(" -> q%d\n", array.dFinal);
exit(0); exit(0);
/* Build RegExp */ /* Build RegExp */