/***** * * Michael Riff * Scanner software version 1.0 10 Jun 2015. * * Diese Datei implementiert die lexikalische Analyse als separate Routine wie es * bei de Werkzeuge Yacc & Lex gemacht wird. * Diese Verion der SW identifiziert nicht direckt die Zeichen in dem Eingangstext. * Als Laufzeit Verbesserung, werden die Zeichen im Eingangstext duch einen numerischen * Wert identifiziert der zeigt ob es sich um eine Zeichenkette, eine Zahl(Ganz/Gleikomma) oder * einen Operator ansonste sonderzeichen. * * Dies ist noch ein Prototyp, so ist der Test Kode sowie Laufzeitmessungs Kode * mit enthalten. * *****/ //#define RESER_WD #include #include #include #ifdef RESER_WD #include #endif //typedef enum { string, integer, floating, operator, openexpr, closeexpr, opencode, endcode, separator } status_type; typedef enum { string, integer, floating, operator, openexpr, closeexpr, opencode, endcode, semicol, separator #ifndef RESER_WD } token_type; #else , and, or, xor, not, leth, geth, lth, gth, t_if, t_else, t_for, t_while, t_do } token_type; #endif /* const unsigned char Str_Msk = 1< //TMTask TimeData; #include struct ExtendedTimerRec { TMTask tmTask; ProcessSerialNumber taskPSN; }; typedef struct ExtendedTimerRec ExtendedTimerRec, *ExtendedTimerPtr; ExtendedTimerRec TimeData; Boolean called; pascal void dummyTask() { called = true; // WakeUpProcess(&((ExtendedTimerRec) TimeData).taskPSN); WakeUpProcess(&(TimeData).taskPSN); } /* short dummyTask() { called = true; WakeUpProcess(&((ExtendedTimerRec) TimeData).taskPSN); } */ typedef struct { token_type tok; char text[15]; int iVal; double fVal; } Entry_Type; Entry_Type Code[100]; int numTok; #endif int main() { #ifdef PRFORMANCE int idx; #endif printf("Lexer test\n"); Init_Lex(test_data); #ifdef PRFORMANCE numTok = 0; called = false; TimeData.tmTask.qLink = NULL; TimeData.tmTask.qType = 0; // TimeData.tmAddr = NewTimerProc(dummyTask); TimeData.tmTask.tmAddr = NewTimerProc(dummyTask); TimeData.tmTask.tmCount = 0; //TimeData.tmTask.tmWakeup = 0; TimeData.tmTask.tmReserved = 0; // InsTime(&TimeData); GetCurrentProcess(&TimeData.taskPSN); InsXTime((QElemPtr) &TimeData.tmTask); // PrimeTime(&TimeData, 1500); PrimeTime((QElemPtr) &TimeData.tmTask, 1500); #endif token = yylex(); do { #ifdef PRFORMANCE Code[numTok].tok = token; #endif switch(token) { #ifndef PRFORMANCE case string: printf("Str "); print(yyval.str_val); printf("\n"); break; case integer: printf("Int %d\n", yyval.int_val); break; case floating: printf("Ftl %f\n", yyval.flt_val); // printf("Ftl %g\n", yyval.flt_val); break; case operator: printf("Op "); print(yyval.str_val); printf("\n"); break; case openexpr: printf("Parenth (\n"); break; case closeexpr: printf("Parenth )\n"); break; case opencode: printf("{\n"); break; case endcode: printf("}\n"); break; case separator: printf("Sep\n"); break; case semicol: printf("Stop ;\n"); break; default: printf("-> other token %d \n"); #else case string: BlockMove("Str ", (Code[numTok].text), 4); BlockMove(yyval.str_val.text, Code[numTok].text+4, yyval.str_val.length); Code[numTok].text[yyval.str_val.length+4] = 0; numTok++; break; case integer: BlockMove("Int ", (Code[numTok].text), 5); Code[numTok].iVal = yyval.int_val; numTok++; break; case floating: BlockMove("Ftl ", (Code[numTok].text), 5); Code[numTok].fVal = yyval.flt_val; numTok++; break; case operator: BlockMove("Op ", (Code[numTok].text), 3); BlockMove(yyval.str_val.text, (Code[numTok].text+3), yyval.str_val.length); Code[numTok].text[yyval.str_val.length+3] = 0; numTok++; break; case openexpr: BlockMove("Parenth (", (Code[numTok].text), 10); numTok++; break; case closeexpr: BlockMove("Parenth )", (Code[numTok].text), 10); numTok++; break; case opencode: Code[numTok].text[0] = '{'; numTok++; break; case endcode: Code[numTok].text[0] = '}'; numTok++; break; case separator: BlockMove("Sep ", (Code[numTok].text), 4); numTok++; break; case semicol: BlockMove("Stop ;", (Code[numTok].text), 6); numTok++; break; default: printf("-> other token %d \n"); #endif } token = yylex(); } while (-1 != token && 0xFF != token); #ifdef PRFORMANCE // RmvTime(&TimeData); // Immediately stop it. Unused time returned in negated microsecs RmvTime((QElemPtr)&TimeData.tmTask); // Immediately stop it. Unused time returned in negated microsecs if (called) { printf("Timeout happened!!"); } else { // printf("Rem time %d", TimeData.tmCount); printf("Rem time %d %d\n", numTok, TimeData.tmTask.tmCount); for (idx=0;idx other token %d \n"); } } } #endif return EXIT_SUCCESS; }