All pastes #509905 Raw Edit

Mine

public text v1 · immutable
·published 2007-05-25 18:10 UTC
rendered paste body
%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;

	}
}

}