expression parsing has begun
[manmower/obtheme.git] / obtheme.y
index 4ebd13d..ffcf862 100644 (file)
--- a/obtheme.y
+++ b/obtheme.y
@@ -100,6 +100,14 @@ void parser_finish(struct parser_control *c)
        free(c);
 }
 
+struct expression *exdup(struct expression in)
+{
+       struct expression *out;
+       out = malloc(sizeof(struct expression));
+       *out = in;
+       return out;
+}
+
 %}
 %start theme_objects
 
@@ -118,6 +126,8 @@ void parser_finish(struct parser_control *c)
        ObCursor dir;
        ObFrameContext context;
        RrSurfaceColorType gradient;
+       struct expression expr;
+       struct variable var;
 }
 
 %token NORTH NORTHEAST EAST SOUTHEAST SOUTH SOUTHWEST
@@ -125,12 +135,12 @@ void parser_finish(struct parser_control *c)
 %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
@@ -143,6 +153,12 @@ void parser_finish(struct parser_control *c)
 %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
@@ -178,21 +194,34 @@ material_decl     : MATERIAL ID LCB material_props RCB {
                }
                ;
 
-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; }
                ;
@@ -250,8 +279,20 @@ style              : STYLE ID LCB styleitems RCB {
 
 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));
@@ -310,4 +351,36 @@ gradient   : GRADIENT LB ID RB {
                }
                ;
 
+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; }
+               ;
+
 %%