rofi/lexer/theme-parser.y

210 lines
5.6 KiB
Text
Raw Normal View History

2016-12-12 15:55:31 +00:00
%define api.pure
%locations
%glr-parser
%skeleton "glr.c"
2016-12-09 18:49:49 +00:00
%debug
%error-verbose
%parse-param {const char *what}
2016-12-09 18:49:49 +00:00
%code requires {
#include "theme.h"
}
%{
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
2016-12-09 18:49:49 +00:00
2016-12-12 15:55:31 +00:00
#include "lexer/theme-parser.h"
ThemeWidget *rofi_theme = NULL;
void yyerror(YYLTYPE *yylloc, const char *what, const char* s);
2016-12-12 15:55:31 +00:00
int yylex (YYSTYPE *, YYLTYPE *);
2016-12-09 18:49:49 +00:00
%}
%union {
int ival;
double fval;
char *sval;
int bval;
2016-12-10 18:48:44 +00:00
ThemeColor colorval;
ThemeWidget *theme;
2016-12-09 18:49:49 +00:00
GList *name_path;
Property *property;
GHashTable *property_list;
2016-12-31 21:47:22 +00:00
Distance distance;
2016-12-09 18:49:49 +00:00
}
%token <ival> T_END 0 "end of file"
%token <ival> T_ERROR 1 "error from file parser"
%token <ival> T_ERROR_PROPERTY 2 "invalid property value"
%token <ival> T_ERROR_ENTRY 3 "invalid property name"
%token <ival> T_ERROR_NAMESTRING 4 "invalid element name"
%token <ival> T_ERROR_DEFAULTS 5 "invalid defaults name"
2016-12-09 18:49:49 +00:00
%token <ival> T_INT
2016-12-09 21:16:31 +00:00
%token <fval> T_DOUBLE
2016-12-09 18:49:49 +00:00
%token <sval> T_STRING
%token <sval> N_STRING "property name"
%token <ival> T_POSITION;
%token <ival> T_HIGHLIGHT_STYLE
%token <sval> NAME_ELEMENT "Element name"
2016-12-09 18:49:49 +00:00
%token <bval> T_BOOLEAN
%token <colorval> T_COLOR
2016-12-31 21:47:22 +00:00
%token <distance> T_PIXEL
2017-01-05 17:22:34 +00:00
%token <sval> T_LINK
%token <sval> FIRST_NAME
2016-12-09 18:49:49 +00:00
2017-01-09 17:32:26 +00:00
%token BOPEN "bracket open"
%token BCLOSE "bracket close"
%token PSEP "property separator"
%token PCLOSE "property close"
%token NSEP "Name separator"
%token NAME_PREFIX "Name element prefix ('#')"
%token WHITESPACE "White space"
%token PDEFAULTS "Default settings section ( '* { ... }')"
2016-12-09 18:49:49 +00:00
%type <ival> highlight_styles
2016-12-09 21:16:31 +00:00
%type <sval> entry
2016-12-09 18:49:49 +00:00
%type <sval> pvalue
2016-12-09 21:16:31 +00:00
%type <theme> entries
2016-12-09 18:49:49 +00:00
%type <name_path> name_path
%type <property> property
%type <property_list> property_list
%type <property_list> optional_properties
%start entries
2016-12-09 18:49:49 +00:00
%%
entries:
2016-12-09 21:16:31 +00:00
%empty {
2016-12-09 18:49:49 +00:00
// There is always a base widget.
if (rofi_theme == NULL ){
$$ = rofi_theme = (ThemeWidget*)g_malloc0 (sizeof(ThemeWidget));
rofi_theme->name = g_strdup ( "Root" );
}
2016-12-09 18:49:49 +00:00
}
| entries
entry {
}
2016-12-09 18:49:49 +00:00
;
entry:
NAME_PREFIX name_path BOPEN optional_properties BCLOSE
{
ThemeWidget *widget = rofi_theme;
for ( GList *iter = g_list_first ( $2 ); iter ; iter = g_list_next ( iter ) ) {
widget = rofi_theme_find_or_create_name ( widget, iter->data );
}
g_list_foreach ( $2, (GFunc)g_free , NULL );
g_list_free ( $2 );
widget->set = TRUE;
rofi_theme_widget_add_properties ( widget, $4);
2017-01-06 22:41:10 +00:00
}
|
PDEFAULTS BOPEN optional_properties BCLOSE {
rofi_theme_widget_add_properties ( rofi_theme, $3);
}
;
2016-12-09 18:49:49 +00:00
/**
* properties
*/
optional_properties
: %empty { $$ = NULL; }
| property_list { $$ = $1; }
2016-12-09 21:16:31 +00:00
;
2016-12-09 18:49:49 +00:00
2016-12-09 21:16:31 +00:00
property_list:
2016-12-09 18:49:49 +00:00
property {
2016-12-09 21:16:31 +00:00
$$ = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, (GDestroyNotify)rofi_theme_property_free );
2016-12-09 18:49:49 +00:00
g_hash_table_replace ( $$, $1->name, $1 );
}
| property_list property {
// Old will be free'ed, and key/value will be replaced.
g_hash_table_replace ( $$, $2->name, $2 );
}
;
property
: pvalue PSEP T_INT PCLOSE {
$$ = rofi_theme_property_create ( P_INTEGER );
$$->name = $1;
2016-12-09 21:16:31 +00:00
$$->value.i = $3;
2016-12-09 18:49:49 +00:00
}
2016-12-09 21:16:31 +00:00
| pvalue PSEP T_DOUBLE PCLOSE {
$$ = rofi_theme_property_create ( P_DOUBLE );
2016-12-09 18:49:49 +00:00
$$->name = $1;
2016-12-09 21:16:31 +00:00
$$->value.f = $3;
2016-12-09 18:49:49 +00:00
}
2016-12-09 21:16:31 +00:00
| pvalue PSEP T_COLOR PCLOSE {
2016-12-09 18:49:49 +00:00
$$ = rofi_theme_property_create ( P_COLOR );
$$->name = $1;
2016-12-09 21:16:31 +00:00
$$->value.color = $3;
2016-12-09 18:49:49 +00:00
}
2016-12-09 21:16:31 +00:00
| pvalue PSEP T_STRING PCLOSE {
2016-12-09 18:49:49 +00:00
$$ = rofi_theme_property_create ( P_STRING );
$$->name = $1;
2016-12-09 21:16:31 +00:00
$$->value.s = $3;
2016-12-09 18:49:49 +00:00
}
2017-01-05 17:22:34 +00:00
| pvalue PSEP T_LINK PCLOSE {
$$ = rofi_theme_property_create ( P_LINK );
$$->name = $1;
$$->value.link.name = $3;
}
2016-12-09 18:49:49 +00:00
| pvalue PSEP T_BOOLEAN PCLOSE {
$$ = rofi_theme_property_create ( P_BOOLEAN );
$$->name = $1;
2016-12-09 21:16:31 +00:00
$$->value.b = $3;
2016-12-09 18:49:49 +00:00
}
| pvalue PSEP T_PIXEL PCLOSE {
$$ = rofi_theme_property_create ( P_PADDING );
$$->name = $1;
2016-12-31 21:47:22 +00:00
$$->value.padding = (Padding){ $3, $3, $3, $3 };
}
| pvalue PSEP T_PIXEL T_PIXEL PCLOSE {
$$ = rofi_theme_property_create ( P_PADDING );
$$->name = $1;
$$->value.padding = (Padding){ $3, $4, $3, $4 };
}
| pvalue PSEP T_PIXEL T_PIXEL T_PIXEL PCLOSE {
$$ = rofi_theme_property_create ( P_PADDING );
$$->name = $1;
$$->value.padding = (Padding){ $3, $4, $5, $4 };
}
| pvalue PSEP T_PIXEL T_PIXEL T_PIXEL T_PIXEL PCLOSE {
$$ = rofi_theme_property_create ( P_PADDING );
$$->name = $1;
2016-12-31 21:47:22 +00:00
$$->value.padding = (Padding){ $3, $4, $5, $6 };
}
| pvalue PSEP T_POSITION PCLOSE{
$$ = rofi_theme_property_create ( P_POSITION );
$$->name = $1;
$$->value.i = $3;
}
| pvalue PSEP highlight_styles T_COLOR PCLOSE {
$$ = rofi_theme_property_create ( P_HIGHLIGHT );
$$->name = $1;
$$->value.highlight.style = $3|HL_COLOR;
$$->value.highlight.color = $4;
}
| pvalue PSEP highlight_styles PCLOSE {
$$ = rofi_theme_property_create ( P_HIGHLIGHT );
$$->name = $1;
$$->value.highlight.style = $3;
}
2016-12-09 18:49:49 +00:00
;
highlight_styles:
T_HIGHLIGHT_STYLE { $$ = $1; }
| highlight_styles T_HIGHLIGHT_STYLE {
$$ = $1 | $2;
}
;
2016-12-09 18:49:49 +00:00
pvalue: N_STRING { $$ = $1; }
name_path:
NAME_ELEMENT { $$ = g_list_append ( NULL, $1 );}
| name_path NSEP NAME_ELEMENT { $$ = g_list_append ( $1, $3);}
| name_path NSEP { $$ = $1; }
2016-12-09 18:49:49 +00:00
;
%%