free(c);
}
+struct expression *exdup(struct expression in)
+{
+ struct expression *out;
+ out = malloc(sizeof(struct expression));
+ *out = in;
+ return out;
+}
+
%}
%start theme_objects
ObCursor dir;
ObFrameContext context;
RrSurfaceColorType gradient;
+ struct expression expr;
+ struct variable var;
}
%token NORTH NORTHEAST EAST SOUTHEAST SOUTH SOUTHWEST
%token LCB RCB LB RB
%token LEFT_ARROW RIGHT_ARROW DOUBLE_ARROW
%token SEMICOLON AT COLON DEFAULT NOT
-%token PLUS MINUS
+%token PLUS MINUS STAR SLASH COMMA
%token <string> STRING ID
%token <integer> NUMBER SUBST BULK BIG LITTLE
%token THEME FRAME SPACE GEOMETRY MATERIAL GRADIENT
%token CONTEXT CURSOR UP ANCHOR STYLE TEXTURE OPACITY
-%token SHAPEOF DECOR
+%token SHAPEOF DECOR DOT
%type <decor> decor
%type <decor> decoritems styleitem
%type <space> space
%type <dir> cursor
%type <context> context
%type <gradient> gradient
+%type <expr> expression
+%type <var> variable
+
+%left PLUS MINUS
+%left STAR SLASH
+%left LB
%%
theme_object : material_decl
}
;
-anchor : ANCHOR LB NUMBER NUMBER NUMBER RB {
+anchor : ANCHOR LB expression COMMA expression COMMA expression RB {
$$.x = $3;
- $$.y = $4;
- $$.z = $5;
+ $$.y = $5;
+ $$.z = $7;
}
;
-up : UP LB NUMBER NUMBER NUMBER RB {
+up : UP LB expression COMMA expression COMMA expression RB {
$$.x = $3;
- $$.y = $4;
- $$.z = $5;
+ $$.y = $5;
+ $$.z = $7;
}
;
-spaceconstraints: /* empty */ { memset(&$$, 0, sizeof($$)); }
+spaceconstraints: /* empty */ { memset(&$$, 0, sizeof($$));
+ $$.anchor.x.op = OB_THEME_EQL;
+ $$.anchor.x.v.number = 1;
+ $$.anchor.y.op = OB_THEME_EQL;
+ $$.anchor.y.v.number = 1;
+ $$.anchor.z.op = OB_THEME_EQL;
+ $$.anchor.z.v.number = 1;
+ $$.up.x.op = OB_THEME_EQL;
+ $$.up.x.v.number = 1;
+ $$.up.y.op = OB_THEME_EQL;
+ $$.up.y.v.number = 1;
+ $$.up.z.op = OB_THEME_EQL;
+ $$.up.z.v.number = 1;
+ }
| spaceconstraints anchor { $1.anchor = $2; $$ = $1; }
| spaceconstraints up { $1.up = $2; $$ = $1; }
;
decoritems : /* empty */ {
memset(&$$, 0, sizeof($$));
- $$.space.up.y = -1;
+// $$.space.up.y = -1; XXX need a sane default!
$$.cursor = OB_CURSOR_NONE;
+ $$.space.anchor.x.op = OB_THEME_EQL;
+ $$.space.anchor.x.v.number = 1;
+ $$.space.anchor.y.op = OB_THEME_EQL;
+ $$.space.anchor.y.v.number = 1;
+ $$.space.anchor.z.op = OB_THEME_EQL;
+ $$.space.anchor.z.v.number = 1;
+ $$.space.up.x.op = OB_THEME_EQL;
+ $$.space.up.x.v.number = 1;
+ $$.space.up.y.op = OB_THEME_EQL;
+ $$.space.up.y.v.number = 1;
+ $$.space.up.z.op = OB_THEME_EQL;
+ $$.space.up.z.v.number = 1;
}
| decoritems decor {
struct decor *out = malloc(sizeof(struct decor));
}
;
+variable : ID DOT ID { $$.base = $1; $$.member = $3; }
+ | ID { $$.base = $1; $$.member = NULL; }
+ | NUMBER { $$.base = NULL; $$.number = $1; }
+ ;
+
+expression : expression STAR expression {
+ $$.op = OB_THEME_MUL;
+ $$.a = exdup($1);
+ $$.b = exdup($3);
+ }
+ | expression SLASH expression {
+ $$.op = OB_THEME_DIV;
+ $$.a = exdup($1);
+ $$.b = exdup($3);
+ }
+ | expression PLUS expression {
+ $$.op = OB_THEME_ADD;
+ $$.a = exdup($1);
+ $$.b = exdup($3);
+ }
+ | expression MINUS expression {
+ $$.op = OB_THEME_SUB;
+ $$.a = exdup($1);
+ $$.b = exdup($3);
+ }
+ | variable {
+ $$.op = OB_THEME_EQL;
+ $$.v = $1;
+ }
+ | LB expression RB { $$ = $2; }
+ ;
+
%%