summaryrefslogtreecommitdiff
path: root/yy/kalmia.l
blob: 42ab9e120208af296611ec660cd86509c472e9a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
%option noinput nounput noyywrap noreject 8bit
%option reentrant bison-bridge bison-locations
%option prefix="kalmia"
%start STRING TAG_START 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_START);     return S_TAG_OPEN; }
<INITIAL>"</"               { BEGIN(TAG_START);     return E_TAG_OPEN; }
<TAG>">"                    { BEGIN(INITIAL); return TAG_CLOSE; }
<TAG>"/>"                   { BEGIN(INITIAL); return EMPTY_TAG_CLOSE; }


<TAG_START>[a-zA-Z_:][a-zA-Z0-9\.\-_:]* { 
	/* generic tag name */
	BEGIN(TAG);
	yylval->string = strdup(yytext); 
	return NAME; 
}
<TAG>[a-zA-Z_:][a-zA-Z0-9\.\-_:]* {
	/* 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;
}