%option noinput nounput noyywrap 8bit nodefault %option reentrant bison-bridge bison-locations %option prefix="kalmia" %start STRING TAG %{ #include <string.h> #define YYLTYPE KALMIALTYPE #define YYSTYPE KALMIASTYPE #include "kalmia.tab.h" #define YY_USER_ACTION \ yylloc->first_line = yylloc->last_line; \ yylloc->first_column = yylloc->last_column; \ if (*yytext == '\n') { \ yylloc->last_line += 1; \ yylloc->last_column = 0; \ } \ else { \ yylloc->last_column += yyleng; \ } %} S \x20\x0a\x0d\x09 ATTR ([\x20\x0a\x0d\x09]*)?"=" %% <INITIAL>"<?xml".*"?>" { /* xml prologue */ return PROLOG; } <INITIAL>[\x20\x0a\x0d\x09] | <TAG>[\x20\x0a\x0d\x09] { /* ignore whitespace */ } <INITIAL>"<" { BEGIN(TAG); return S_TAG_OPEN; } <INITIAL>"</" { BEGIN(TAG); return E_TAG_OPEN; } <TAG>">" { BEGIN(INITIAL); return TAG_CLOSE; } <TAG>"/>" { BEGIN(INITIAL); return EMPTY_TAG_CLOSE; } <TAG>[a-zA-Z_:][a-zA-Z0-9\.\-_:]* { /* generic tag name */ yylval->string = strdup(yytext); return NAME; } <TAG>[a-zA-Z_:][a-zA-Z0-9\.\-_:]*/{ATTR} { /* generic attribute key */ yylval->string = strdup(yytext); return ATTR; } <TAG>"=" { /* attribute "=" */ return *yytext; } <TAG>"\"" { /* begin a string */ BEGIN(STRING); return *yytext; } <STRING>"\"" { /* end a string */ BEGIN(TAG); return *yytext; } <STRING>[^"]+ { /* within a string */ yylval->string = strdup(yytext); return TEXT; } <INITIAL>[^\x20\x0a\x0d\x09<][^<]*[^\x20\x0a\x0d\x09<] { yylval->string = strdup(yytext); return CONTENT; }