%option noyywrap %{ #include #include #include #include "scanner.h" %} KEYWORD and|array|bool|byte|begin|const|div|do|elif|else|end|false|for|function|goto|if|interrupt|label|mod|nil|not|of|or|port|procedure|program|record|short|then|to|true|type|var|while OPERATOR ":="|":"|","|"."|".."|"="|">="|">"|"["|"<="|"("|"<"|"-"|"<>"|"+"|"]"|")"|";"|"*"|"**"|"^" EMPTY [ \t\r\n\b] IDF [a-z]([a-z0-9])* DIGIT [0-9] HEX (16#|0[x])[0-9a-f]+ OCTAL 8#[0-7]+ DNUMBER {DIGIT}+ %% {KEYWORD}/({EMPTY}|{OPERATOR}) return KEYWORD; {OPERATOR} return OPERATOR; {IDF}/({EMPTY}|{OPERATOR}) return IDF; {HEX}/({EMPTY}|{OPERATOR}) return HEX; {OCTAL}/({EMPTY}|{OPERATOR}) return OCTAL; {DNUMBER}/({EMPTY}|{OPERATOR}) return DNUMBER; \"(\\[\\tn\"]|[^\\])*\" "(*"[^*]*"*)" "{"[^}\n]*"}" {EMPTY} ' { /* * Erkennung Pascal-artiger Strings, in denen das Stringende aus * eine ungeradzahlig langen maximale Sequenz von '-Zeichen besteht. * Alternative Implementierung mit manueller Stringerkennung: alle * auf das erste Zeichen folgenden Zeichen werden in einem Puffer * gesammelt, ist dieser Puffer voll, werden weitere Zeichen nicht * ignoriert, bis ein terminierendes ' gefunden wird. */ char stringBuffer[1024]; int index = 0; memset(stringBuffer, 0, sizeof stringBuffer); while ( index < sizeof(stringBuffer)-1 ) { int next = input(); if ( next == EOF ) { break; } if ( next != '\'' ) { stringBuffer[index++] = next; continue; } /* * Wenn das nchste Zeichen auch ein ' ist, mssen wir ein * einzelnes ' einfgen, sonst ist der String beendet */ next = input(); if ( next == EOF ) { break; } if ( next == '\'' ) { stringBuffer[index++] = next; continue; } /* * Das gefundene Zeichen gehrte hinter den String, also ist * der String beendet, das Zeichen wird an die Eingabe zurck * gespeichert. */ unput(next); break; } } %{//YY_FLUSH_BUFFER; was removbed due to lookahead %} . return ERROR; %% void runScanner() { while(1){ int ret = yylex(); switch(ret){ case KEYWORD: printf("got keyword haha\n"); break; case OPERATOR: printf("got operator haha\n"); break; case IDF: printf("got identifier haha\n"); break; case ERROR: //YY_FLUSH_BUFFER; not needed anymore printf("got error haha\n"); break; case HEX: printf("got hex hahaa\n"); break; case OCTAL: printf("got octal haha\n"); break; case DNUMBER: printf("got decimal haha\n"); break; } } }