2016-12-12 10:55:31 -05:00
|
|
|
%option noyywrap nounput
|
2017-01-05 16:04:39 -05:00
|
|
|
%option never-interactive
|
2016-12-12 10:55:31 -05:00
|
|
|
%option bison-locations
|
2016-12-09 13:49:49 -05:00
|
|
|
|
|
|
|
%{
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
2016-12-09 14:04:50 -05:00
|
|
|
#include "lexer/theme-parser.h"
|
2016-12-17 10:16:28 -05:00
|
|
|
int last_state = 0;
|
|
|
|
GQueue *queue = NULL;
|
2016-12-09 13:49:49 -05:00
|
|
|
|
2016-12-12 10:55:31 -05:00
|
|
|
%}
|
|
|
|
%{
|
|
|
|
|
|
|
|
#define YY_USER_ACTION {\
|
|
|
|
yylloc->last_column+= yyleng;\
|
|
|
|
}
|
|
|
|
#define YY_LLOC_START {\
|
2017-01-05 16:04:39 -05:00
|
|
|
yylloc->first_line = yylloc->last_line;\
|
|
|
|
yylloc->first_column = yylloc->last_column;\
|
2016-12-12 10:55:31 -05:00
|
|
|
}
|
2016-12-09 13:49:49 -05:00
|
|
|
%}
|
2017-01-05 16:04:39 -05:00
|
|
|
WHITESPACE [[:blank:]]
|
2016-12-19 11:48:20 -05:00
|
|
|
WORD [[:alnum:]-]+
|
|
|
|
STRING [[:print:]]+
|
|
|
|
HEX [[:xdigit:]]
|
2016-12-31 15:37:19 -05:00
|
|
|
NUMBER [[:digit:]]
|
2016-12-31 17:27:17 -05:00
|
|
|
REAL [[:digit:]]+(\.[[:digit:]]+)?
|
2016-12-31 15:37:19 -05:00
|
|
|
PX (px)
|
2016-12-31 16:47:22 -05:00
|
|
|
EM (em)
|
2017-01-03 13:23:09 -05:00
|
|
|
PERCENT (\%)
|
2016-12-12 17:40:43 -05:00
|
|
|
|
2017-01-04 16:27:27 -05:00
|
|
|
LS_DASH "dash"
|
|
|
|
LS_SOLID "solid"
|
|
|
|
|
2016-12-12 17:40:43 -05:00
|
|
|
%x PROPERTIES
|
|
|
|
%x NAMESTR
|
2016-12-17 10:16:28 -05:00
|
|
|
%x ENTRY
|
2016-12-09 13:49:49 -05:00
|
|
|
%%
|
2016-12-12 10:55:31 -05:00
|
|
|
|
|
|
|
%{
|
|
|
|
YY_LLOC_START
|
|
|
|
%}
|
2016-12-17 10:16:28 -05:00
|
|
|
%{
|
|
|
|
if ( queue == NULL ){
|
|
|
|
queue = g_queue_new ( );
|
|
|
|
}
|
|
|
|
%}
|
2017-01-05 16:04:39 -05:00
|
|
|
|
2016-12-17 10:16:28 -05:00
|
|
|
<*>"//" {
|
2016-12-11 12:25:47 -05:00
|
|
|
int c;
|
2016-12-12 10:55:31 -05:00
|
|
|
while ((c = input()) != EOF){
|
2016-12-11 12:25:47 -05:00
|
|
|
if (c == '\n') {
|
2016-12-12 10:55:31 -05:00
|
|
|
yylloc->last_column = 1;
|
|
|
|
yylloc->last_line ++;
|
2016-12-11 12:25:47 -05:00
|
|
|
break;
|
|
|
|
}
|
2016-12-12 10:55:31 -05:00
|
|
|
yylloc->last_column++;
|
|
|
|
}
|
|
|
|
YY_LLOC_START
|
2016-12-11 12:25:47 -05:00
|
|
|
}
|
2016-12-17 10:16:28 -05:00
|
|
|
<*>"/*" {
|
2016-12-11 12:25:47 -05:00
|
|
|
int c = 0, p;
|
|
|
|
int nesting_depth = 1;
|
|
|
|
while (nesting_depth) {
|
|
|
|
p = c;
|
|
|
|
c = input();
|
|
|
|
switch (c) {
|
2016-12-12 10:55:31 -05:00
|
|
|
case '*': yylloc->last_column++; if (p == '/') { c = 0; nesting_depth++; } break;
|
|
|
|
case '/': yylloc->last_column++; if (p == '*') { c = 0; nesting_depth--; } break;
|
|
|
|
case '\n': {
|
|
|
|
yylloc->last_column = 1;
|
|
|
|
yylloc->last_line ++;
|
|
|
|
break;
|
|
|
|
}
|
2016-12-11 12:25:47 -05:00
|
|
|
case EOF: nesting_depth = 0; break;
|
2016-12-12 10:55:31 -05:00
|
|
|
default:
|
|
|
|
yylloc->last_column++;
|
|
|
|
;
|
2016-12-11 12:25:47 -05:00
|
|
|
}
|
|
|
|
}
|
2016-12-12 10:55:31 -05:00
|
|
|
YY_LLOC_START
|
2016-12-11 12:25:47 -05:00
|
|
|
}
|
2016-12-12 15:14:57 -05:00
|
|
|
|
2016-12-17 10:16:28 -05:00
|
|
|
/* Go into parsing an entry */
|
|
|
|
<INITIAL>"\{" {
|
|
|
|
g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) );
|
|
|
|
BEGIN(ENTRY);
|
|
|
|
return BOPEN;
|
|
|
|
}
|
|
|
|
/* Pop out of parsing an entry. */
|
|
|
|
<ENTRY>"\}" {
|
|
|
|
BEGIN(GPOINTER_TO_INT(g_queue_pop_head ( queue )));
|
|
|
|
return BCLOSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
<INITIAL>"#" { g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) ); BEGIN(NAMESTR);return NAME_PREFIX;}
|
|
|
|
<INITIAL,NAMESTR>"." { return NSEP; }
|
|
|
|
<INITIAL,ENTRY>{WORD} { yylval->sval = g_strdup(yytext); return N_STRING;}
|
|
|
|
<NAMESTR>{WORD} { yylval->sval = g_strdup(yytext); return NAME_ELEMENT;}
|
2016-12-12 17:40:43 -05:00
|
|
|
|
2016-12-17 10:16:28 -05:00
|
|
|
/* After Namestr/Classstr we want to go to state str, then to { */
|
|
|
|
<NAMESTR>{WHITESPACE} { BEGIN(GPOINTER_TO_INT (g_queue_pop_head ( queue )));}
|
|
|
|
<INITIAL,ENTRY>{WHITESPACE}+ ; // ignore all whitespace
|
2016-12-12 17:40:43 -05:00
|
|
|
<PROPERTIES>{WHITESPACE}+ ; // ignore all whitespace
|
2016-12-11 11:50:03 -05:00
|
|
|
|
2016-12-17 10:16:28 -05:00
|
|
|
<INITIAL,ENTRY>":" { g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) ); BEGIN(PROPERTIES); return PSEP; }
|
|
|
|
<PROPERTIES>";" { BEGIN(GPOINTER_TO_INT ( g_queue_pop_head ( queue ))); return PCLOSE;}
|
2016-12-12 17:40:43 -05:00
|
|
|
<PROPERTIES>(true|false) { yylval->bval= g_strcmp0(yytext, "true") == 0; return T_BOOLEAN;}
|
|
|
|
<PROPERTIES>{NUMBER}+ { yylval->ival = (int)g_ascii_strtoll(yytext, NULL, 10); return T_INT;}
|
|
|
|
<PROPERTIES>{NUMBER}+\.{NUMBER}+ { yylval->fval = g_ascii_strtod(yytext, NULL); return T_DOUBLE;}
|
|
|
|
<PROPERTIES>\"{STRING}\" { yytext[yyleng-1] = '\0'; yylval->sval = g_strdup(&yytext[1]); return T_STRING;}
|
2017-01-05 12:22:34 -05:00
|
|
|
<PROPERTIES>@{WORD} {
|
|
|
|
yylval->sval = g_strdup(yytext);
|
|
|
|
return T_LINK;
|
|
|
|
}
|
2016-12-31 15:37:19 -05:00
|
|
|
|
2016-12-31 17:27:17 -05:00
|
|
|
<PROPERTIES>{REAL}{EM} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtod(yytext, NULL);
|
|
|
|
yylval->distance.type = PW_EM;
|
2017-01-04 16:27:27 -05:00
|
|
|
yylval->distance.style = SOLID;
|
2016-12-31 16:47:22 -05:00
|
|
|
return T_PIXEL;
|
|
|
|
}
|
2016-12-31 17:27:17 -05:00
|
|
|
<PROPERTIES>{NUMBER}+{PX} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtoll(yytext, NULL, 10);
|
|
|
|
yylval->distance.type = PW_PX;
|
2017-01-04 16:27:27 -05:00
|
|
|
yylval->distance.style = SOLID;
|
|
|
|
return T_PIXEL;
|
|
|
|
}
|
|
|
|
<PROPERTIES>{NUMBER}+{PX}{WHITESPACE}{LS_DASH} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtoll(yytext, NULL, 10);
|
|
|
|
yylval->distance.type = PW_PX;
|
|
|
|
yylval->distance.style = DASH;
|
|
|
|
return T_PIXEL;
|
|
|
|
}
|
|
|
|
<PROPERTIES>{NUMBER}+{EM}{WHITESPACE}{LS_DASH} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtoll(yytext, NULL, 10);
|
|
|
|
yylval->distance.type = PW_PX;
|
|
|
|
yylval->distance.style = DASH;
|
|
|
|
return T_PIXEL;
|
|
|
|
}
|
|
|
|
<PROPERTIES>{NUMBER}+{PX}{WHITESPACE}{LS_SOLID} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtoll(yytext, NULL, 10);
|
|
|
|
yylval->distance.type = PW_PX;
|
|
|
|
yylval->distance.style = SOLID;
|
|
|
|
return T_PIXEL;
|
|
|
|
}
|
|
|
|
<PROPERTIES>{NUMBER}+{EM}{WHITESPACE}{LS_SOLID} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtoll(yytext, NULL, 10);
|
|
|
|
yylval->distance.type = PW_PX;
|
|
|
|
yylval->distance.style = SOLID;
|
2016-12-31 15:37:19 -05:00
|
|
|
return T_PIXEL;
|
|
|
|
}
|
2017-01-03 13:23:09 -05:00
|
|
|
<PROPERTIES>{REAL}{PERCENT} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtod(yytext, NULL);
|
|
|
|
yylval->distance.type = PW_PERCENT;
|
2017-01-04 16:27:27 -05:00
|
|
|
yylval->distance.style = SOLID;
|
|
|
|
return T_PIXEL;
|
|
|
|
}
|
|
|
|
<PROPERTIES>{REAL}{PERCENT}{WHITESPACE}{LS_SOLID} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtod(yytext, NULL);
|
|
|
|
yylval->distance.type = PW_PERCENT;
|
|
|
|
yylval->distance.style = SOLID;
|
|
|
|
return T_PIXEL;
|
|
|
|
}
|
|
|
|
<PROPERTIES>{REAL}{PERCENT}{WHITESPACE}{LS_DASH} {
|
|
|
|
yylval->distance.distance = (double)g_ascii_strtod(yytext, NULL);
|
|
|
|
yylval->distance.type = PW_PERCENT;
|
|
|
|
yylval->distance.style = DASH;
|
2017-01-03 13:23:09 -05:00
|
|
|
return T_PIXEL;
|
|
|
|
}
|
2016-12-12 17:40:43 -05:00
|
|
|
<PROPERTIES>#{HEX}{8} {
|
2016-12-11 06:19:46 -05:00
|
|
|
union { unsigned int val; struct { unsigned char b,g,r,a;};} val;
|
2016-12-10 13:48:44 -05:00
|
|
|
val.val = (unsigned int)strtoull ( &yytext[1], NULL, 16);
|
2016-12-12 10:55:31 -05:00
|
|
|
yylval->colorval.alpha = val.a/255.0;
|
|
|
|
yylval->colorval.red = val.r/255.0;
|
|
|
|
yylval->colorval.green = val.g/255.0;
|
|
|
|
yylval->colorval.blue = val.b/255.0;
|
2016-12-11 06:19:46 -05:00
|
|
|
return T_COLOR;
|
|
|
|
}
|
2016-12-13 02:00:35 -05:00
|
|
|
<PROPERTIES>argb:{HEX}{8} {
|
|
|
|
union { unsigned int val; struct { unsigned char b,g,r,a;};} val;
|
|
|
|
val.val = (unsigned int)strtoull ( &yytext[1], NULL, 16);
|
|
|
|
yylval->colorval.alpha = val.a/255.0;
|
|
|
|
yylval->colorval.red = val.r/255.0;
|
|
|
|
yylval->colorval.green = val.g/255.0;
|
|
|
|
yylval->colorval.blue = val.b/255.0;
|
|
|
|
return T_COLOR;
|
|
|
|
}
|
2016-12-12 17:40:43 -05:00
|
|
|
<PROPERTIES>#{HEX}{6} {
|
2016-12-11 06:19:46 -05:00
|
|
|
union { unsigned int val; struct { unsigned char b,g,r,a;};} val;
|
2016-12-11 11:50:03 -05:00
|
|
|
val.val = (unsigned int)g_ascii_strtoull ( &yytext[1], NULL, 16);
|
2016-12-12 10:55:31 -05:00
|
|
|
yylval->colorval.alpha = 1.0;
|
|
|
|
yylval->colorval.red = val.r/255.0;
|
|
|
|
yylval->colorval.green = val.g/255.0;
|
|
|
|
yylval->colorval.blue = val.b/255.0;
|
2016-12-10 13:48:44 -05:00
|
|
|
return T_COLOR;
|
2016-12-11 11:50:03 -05:00
|
|
|
}
|
2016-12-12 17:40:43 -05:00
|
|
|
<PROPERTIES>rgba\({NUMBER}{1,3},{NUMBER}{1,3},{NUMBER}{1,3},[01](\.{NUMBER}+)?\) {
|
2016-12-11 11:50:03 -05:00
|
|
|
char *endptr = &yytext[5];
|
2016-12-12 10:55:31 -05:00
|
|
|
yylval->colorval.red = g_ascii_strtoull ( endptr, &endptr, 10);
|
|
|
|
yylval->colorval.green= g_ascii_strtoull ( endptr+1, &endptr, 10);
|
|
|
|
yylval->colorval.blue= g_ascii_strtoull ( endptr+1, &endptr, 10);
|
|
|
|
yylval->colorval.alpha= g_ascii_strtod ( endptr+1, NULL);
|
2016-12-11 11:50:03 -05:00
|
|
|
return T_COLOR;
|
|
|
|
}
|
2016-12-12 17:40:43 -05:00
|
|
|
<PROPERTIES>rgb\({NUMBER}{1,3},{NUMBER}{1,3},{NUMBER}{1,3}\) {
|
2016-12-11 11:50:03 -05:00
|
|
|
char *endptr = &yytext[4];
|
2016-12-12 10:55:31 -05:00
|
|
|
yylval->colorval.red = g_ascii_strtoull ( endptr, &endptr, 10);
|
|
|
|
yylval->colorval.green = g_ascii_strtoull ( endptr+1, &endptr, 10);
|
|
|
|
yylval->colorval.blue = g_ascii_strtoull ( endptr+1, &endptr, 10);
|
|
|
|
yylval->colorval.alpha = 1.0;
|
2016-12-11 11:50:03 -05:00
|
|
|
return T_COLOR;
|
2016-12-10 13:48:44 -05:00
|
|
|
}
|
2017-01-05 16:04:39 -05:00
|
|
|
<INITIAL><<EOF>> {
|
|
|
|
g_queue_free ( queue );
|
|
|
|
yyterminate();
|
|
|
|
}
|
2016-12-12 17:40:43 -05:00
|
|
|
|
2017-01-05 16:04:39 -05:00
|
|
|
<*>\n {
|
2017-01-05 12:22:34 -05:00
|
|
|
yylloc->last_column = 1;
|
|
|
|
yylloc->last_line ++;
|
|
|
|
};
|
2016-12-31 15:37:19 -05:00
|
|
|
<*>(\r\n) {
|
2016-12-12 10:55:31 -05:00
|
|
|
yylloc->last_column = 1;
|
|
|
|
yylloc->last_line ++;
|
|
|
|
};
|
2016-12-17 10:16:28 -05:00
|
|
|
<*>. {
|
|
|
|
fprintf(stderr, "Invalid character: '%c'\n", *yytext);
|
|
|
|
yyterminate();
|
|
|
|
}
|
|
|
|
|
2016-12-09 13:49:49 -05:00
|
|
|
%%
|