%option noyywrap
%{
#include <math.h>
#include <string.h>
#include <ctype.h>
#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;
}
}
}