diff --git a/src/linter.c b/src/linter.c index 81fa74b..fb42380 100644 --- a/src/linter.c +++ b/src/linter.c @@ -25,64 +25,121 @@ int main(int argc, char* argv[]){ struct Automate digit = createAutomate("digit"); addDot(&digit); // q0 addDot(&digit); // q1 - addRangeTransition(&digit, "09\0"); // r0 - linkDots(&digit, 0, 0, RANGE_T, 0); // q0 --r0--> q0 + addRangeTransition(&digit, "19\0"); // r0 + addRangeTransition(&digit, "09\0"); // r1 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"); addDot(&number); // q0 addDot(&number); // q1 addDot(&number); // q2 - addListTransition(&number, "+-\0"); // l0 - addAutomateTransition(&number, &positive); // a0 + addDot(&number); // q3 + addDot(&number); // q4 + addStringTransition(&number, ".\0"); // s0 + addListTransition(&number, "+-\0"); // l0 + 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, 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 - 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 + mergeAutomate(&number, 0); - mergeAutomate(&positive, 0); - debug(positive); + struct Automate alphanum = createAutomate("alphanum"); + 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; clock_t start, stop; - strcpy(string, "123,4\0"); - start = clock(); browsed = browse(&positive, string, 0); stop = clock(); - printf("browse '%s' : %d/%d\n", string, browsed, (int) strlen(string)); - printf(" (*) final_state: %d/%d\n", positive.dCurrent, positive.dFinal); - printf(" (*) in %d steps\n", positive.steps); + strcpy(str, "[\"abc\"]\0"); + start = clock(); browsed = browse(&array, str, 0); stop = clock(); + printf("browse '%s' : %d/%d\n", str, browsed, (int) strlen(str)); + printf(" (*) final_state: %d/%d\n", array.dCurrent, array.dFinal); + printf(" (*) in %d steps\n", array.steps); 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 ) 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); /* Build RegExp */