tepal_scan.l 3.66 KB
%{
#include <malloc.h>
#include <string.h>
#include <stdlib.h>

#include <tepal_pars.h>
%}

%x       TOK

DIGITS   [0-9]+
INT      {DIGITS}
FLOAT    {DIGITS}(.{DIGITS})?
STRING   ('[^']*')|(\"[^\"]*\")
IDENT    [a-zA-Z][_0-9a-zA-Z]*|_[0-9a-zA-Z]+
OPERATOR [+\-*/%=,!:\[\]\(\);]

ICAST    int
FCAST    float
SCAST    string

S_TOK    [ \t]*<#
E_TOK    #>
TEXT     (\<[^#].*)|([^\<]*)

%%

{TEXT} {
	char   tok[2];
	size_t len = strlen(yytext);

	yylval.cPtr = (char *)malloc(len + 2);
	memset (yylval.cPtr, 0, len + 2);
	memcpy (yylval.cPtr, yytext, len);

	tok[0] = input();
	tok[1] = input();

	if (tok[1] == '#' || tok[0] == EOF) {
		unput('#');
		unput('<');
	}
	else {
		if (tok[1] != EOF)
			unput(tok[1]);
		yylval.cPtr[len] = tok[0];
	}

#ifdef DEBUG
	fputs("[TOKEN] HTML", stderr);
#endif
	return HTML;
}

{S_TOK} {
	BEGIN(TOK);
#ifdef DEBUG
	fputs("[TOKEN] STMT_END {[ \\t]*<#}", stderr);
#endif
	return STMT_END;
}

<TOK>{E_TOK}\n? {
	BEGIN(INITIAL);
#ifdef DEBUG
	fputs("[TOKEN] STMT_END {#>\\n?}", stderr);
#endif
	return STMT_END;
}

<TOK>{OPERATOR} {
#ifdef DEBUG
	fprintf(stderr, "[TOKEN] %c\n", yytext[0]);
#endif
	yylval.iVal = yytext[0];
	return yytext[0];
}

<TOK>== {
#ifdef DEBUG
	fputs("[TOKEN] EQ", stderr);
#endif
	return EQ;
}

<TOK>!= {
#ifdef DEBUG
    fputs("[TOKEN] NE", stderr);
#endif
    return NE;
}

<TOK>\< {
#ifdef DEBUG
	fputs("[TOKEN] LT", stderr);
#endif
	return LT;
}

<TOK>\> {
#ifdef DEBUG
	fputs("[TOKEN] GT", stderr);
#endif
	return GT;
}

<TOK>\<= {
#ifdef DEBUG
	fputs("[TOKEN] LE", stderr);
#endif
	return LE;
}

<TOK>\>= {
#ifdef DEBUG
	fputs("[TOKEN] GE", stderr);
#endif
	return GE;
}

<TOK>&& {
#ifdef DEBUG
	fputs("[TOKEN] LOGAND", stderr);
#endif
	return LOGAND;
}
<TOK>\|\| {
#ifdef DEBUG
	fputs("[TOKEN] LOGOR", stderr);
#endif
	return LOGOR;
}

<TOK>{INT} {
	yylval.iVal = atol (yytext);
#ifdef DEBUG
	fputs("[TOKEN] INT", stderr);
#endif
	return INT;
}

<TOK>{FLOAT} {
	yylval.fVal = atof(yytext);
#ifdef DEBUG
	fputs("[TOKEN] FLOAT", stderr);
#endif
	return FLOAT;
}

<TOK>{STRING} {
	yylval.cPtr = (char *)malloc(strlen (yytext) - 1);
	memset (yylval.cPtr, 0, strlen(yytext) - 1);
	memcpy (yylval.cPtr, yytext + 1, strlen(yytext) - 2);
#ifdef DEBUG
	fputs("[TOKEN] STRING", stderr);
#endif
	return STRING;
}

<TOK>repeat {
#ifdef DEBUG
	fputs("[TOKEN] REPEAT", stderr);
#endif
	return REPEAT;
}

<TOK>count {
#ifdef DEBUG
	fputs("[TOKEN] COUNT", stderr);
#endif
	return COUNT;
}

<TOK>foreach {
#ifdef DEBUG
	fputs("[TOKEN] FOREACH", stderr);
#endif
	return FOREACH;
}

<TOK>as	{
#ifdef DEBUG
	fputs("[TOKEN] AS", stderr);
#endif
	return AS;
}

<TOK>if {
#ifdef DEBUG
	fputs("[TOKEN] IF", stderr);
#endif
	return IF;
}

<TOK>else {
#ifdef DEBUG
	fputs("[TOKEN] ELSE", stderr);
#endif
	return ELSE;
}

<TOK>end {
#ifdef DEBUG
	fputs("[TOKEN] BLOCK_END", stderr);
#endif
	return BLOCK_END;
}

<TOK>unset {
#ifdef DEBUG
	fputs("[TOKEN] UNSET", stderr);
#endif
	return UNSET;
}

<TOK>eol {
	yylval.cPtr = (char *)calloc(sizeof (char), 2);
	yylval.cPtr[0] = '\n';
	yylval.cPtr[1] = '\0';
#ifdef DEBUG
	fputs("[TOKEN] EOL", stderr);
#endif
	return EOL;
}

<TOK>parent {
#ifdef DEBUG
	fputs("[TOKEN] PARENT", stderr);
#endif
	return PARENT;
}

<TOK>global {
#ifdef DEBUG
	fputs("[TOKEN] GLOBAL", stderr);
#endif
	return GLOBAL;
}

<TOK>{ICAST} {
#ifdef DEBUG
	fputs("[TOKEN] ICAST", stderr);
#endif
	return ICAST;
}

<TOK>{FCAST} {
#ifdef DEBUG
	fputs("[TOKEN] FCAST", stderr);
#endif
	return FCAST;
}
<TOK>{SCAST} {
#ifdef DEBUG
	fputs("[TOKEN] SCAST", stderr);
#endif
	return SCAST;
}

<TOK>{IDENT} {
	yylval.cPtr = (char *)malloc(strlen(yytext) + 1);
	strcpy(yylval.cPtr, yytext);
#ifdef DEBUG
	fputs("[TOKEN] IDENT", stderr);
#endif
	return IDENT;
}

<TOK>[ \t\r\n] { /* eat tokens */ }