face mirroring
[henge/apc.git] / src / parser.y
index 5dc5fdb..2c74db7 100644 (file)
@@ -5,7 +5,7 @@
   #include "ir.h"
   #include "apc.h"
   typedef struct class_state_t yycstate;
-  struct frame_spec_t { apc_facing d; int w, h; };
+  struct frame_spec_t { facinglist list; int w, h; };
 }
 %code provides {
   yycstate* yycstate_new(void);
@@ -49,6 +49,7 @@
   ir_setld   ld;
   ir_setdata data;
   struct frame_spec_t frame_spec;
+  facinglist facinglist;
 }
 /* Operators */
 %token        CLOPEN    //(
 %token <face> FACING
 %token <str>  NAME
 /* Types */
-%type<data>       data_spec
-%type<set>        set_spec
-%type<ld>         set_ld set_link
-%type<frame_spec> frame_spec
+%type<data>        data_spec
+%type<set>         set_spec
+%type<ld>          set_ld set_link
+%type<frame_spec>  frame_spec
+%type<facinglist>  facing_list
 %%
 /* Syntax Directed Translation Scheme of the APC grammar */
 progn:
@@ -100,10 +102,10 @@ statement_list:
 ;
 
 data_spec:
-  SS NAME frame_spec     { $$ = ir_framesheet($2,$3.d,$3.w,$3.h); }
-| SS frame_spec          { $$ = ir_framesheet(DEFAULT_VARIANT,$2.d,$2.w,$2.h); }
-| MAP NAME frame_spec    { $$ = ir_mapsheet($2,$3.d,$3.w,$3.h); }
-| MAP frame_spec         { $$ = ir_mapsheet(DEFAULT_VARIANT,$2.d,$2.w,$2.h); }
+  SS NAME frame_spec     { $$ = ir_framesheet($2,$3.list,$3.w,$3.h); }
+| SS frame_spec          { $$ = ir_framesheet(DEFAULT_VARIANT,$2.list,$2.w,$2.h); }
+| MAP NAME frame_spec    { $$ = ir_mapsheet($2,$3.list,$3.w,$3.h); }
+| MAP frame_spec         { $$ = ir_mapsheet(DEFAULT_VARIANT,$2.list,$2.w,$2.h); }
 | AUDIO NAME             { $$ = ir_audio($2); }
 | LINK set_ld            { $$ = ir_link(OLINK, $2, NULL); }
 | LINK set_ld MAP        { $$ = ir_link(MLINK, $2,NULL); }
@@ -129,11 +131,15 @@ set_ld:
 | REF                    { $$ = ir_setld_from_ref($1); }
 ;
 
+facing_list:
+  facing_list FACING     { $$ = ir_facinglist_push($1,$2); }
+| FACING                 { $$ = ir_facinglist($1); }
+
 frame_spec:
-  NUM NUM                { $$ = (struct frame_spec_t) {SFACE,$1,$2}; }
-| FACING                 { $$ = (struct frame_spec_t) {$1,0,0}; }
-| FACING NUM NUM         { $$ = (struct frame_spec_t) {$1,$2,$3}; }
-| %empty                 { $$ = (struct frame_spec_t) {SFACE,0,0}; }
+  NUM NUM                { $$ = (struct frame_spec_t) {NULL,$1,$2}; }
+| facing_list            { $$ = (struct frame_spec_t) {$1,0,0}; }
+| facing_list NUM NUM    { $$ = (struct frame_spec_t) {$1,$2,$3}; }
+| %empty                 { $$ = (struct frame_spec_t) {NULL,0,0}; }
 ;
 
 %%