# line 2 "laygram.y" #include #include #include #include #include #include #include #include #include "LayoutP.h" static LayoutPtr *dest; # line 17 "laygram.y" typedef union #ifdef __cplusplus YYSTYPE #endif { int ival; XrmQuark qval; BoxPtr bval; BoxParamsPtr pval; GlueRec gval; LayoutDirection lval; ExprPtr eval; Operator oval; } YYSTYPE; # define OC 257 # define CC 258 # define OA 259 # define CA 260 # define OP 261 # define CP 262 # define NAME 263 # define NUMBER 264 # define INFINITY 265 # define VERTICAL 266 # define HORIZONTAL 267 # define EQUAL 268 # define DOLLAR 269 # define PLUS 270 # define MINUS 271 # define TIMES 272 # define DIVIDE 273 # define PERCENTOF 274 # define PERCENT 275 # define WIDTH 276 # define HEIGHT 277 # define UMINUS 278 # define UPLUS 279 #include #include #include #ifdef __cplusplus #ifndef LayYYerror void LayYYerror(const char *); #endif #ifndef LayYYlex #ifdef __EXTERN_C__ extern "C" { int LayYYlex(void); } #else int LayYYlex(void); #endif #endif int LayYYparse(void); #endif #define LayYYclearin LayYYchar = -1 #define LayYYerrok LayYYerrflag = 0 extern int LayYYchar; extern int LayYYerrflag; YYSTYPE LayYYlval; YYSTYPE LayYYval; typedef int LayYYtabelem; #ifndef YYMAXDEPTH #define YYMAXDEPTH 150 #endif #if YYMAXDEPTH > 0 int LayYY_LayYYs[YYMAXDEPTH], *LayYYs = LayYY_LayYYs; YYSTYPE LayYY_LayYYv[YYMAXDEPTH], *LayYYv = LayYY_LayYYv; #else /* user does initial allocation */ int *LayYYs; YYSTYPE *LayYYv; #endif static int LayYYmaxdepth = YYMAXDEPTH; # define YYERRCODE 256 # line 252 "laygram.y" LayYYwrap () { return 1; } LayYYsetdest (c) LayoutPtr *c; { dest = c; } LayYYtabelem LayYYexca[] ={ -1, 1, 0, -1, -2, 0, }; # define YYNPROD 39 # define YYLAST 128 LayYYtabelem LayYYact[]={ 17, 62, 9, 18, 17, 4, 5, 18, 19, 13, 12, 29, 19, 34, 33, 15, 16, 29, 17, 15, 16, 18, 17, 60, 50, 18, 19, 13, 12, 39, 19, 36, 17, 15, 16, 18, 53, 15, 16, 31, 19, 41, 44, 45, 46, 24, 30, 15, 16, 42, 43, 44, 45, 46, 23, 4, 5, 66, 63, 26, 20, 6, 49, 38, 35, 32, 51, 10, 11, 2, 7, 14, 1, 14, 3, 25, 22, 27, 28, 21, 8, 0, 0, 0, 0, 0, 0, 0, 14, 0, 40, 37, 0, 0, 0, 0, 0, 0, 0, 47, 48, 0, 0, 54, 52, 0, 0, 0, 55, 56, 57, 58, 59, 0, 0, 52, 0, 61, 0, 0, 0, 0, 0, 0, 64, 0, 0, 65 }; LayYYtabelem LayYYpact[]={ -211,-10000000,-10000000, -196,-10000000,-10000000, -261, -198, -261, -214, -200,-10000000, -239, -239, -258, -217, -224, -257,-10000000, -232, -10000000,-10000000,-10000000, -243, -241,-10000000, -241, -258, -258,-10000000, -10000000,-10000000, -221, -257, -257, -258,-10000000,-10000000, -247, -229, -247,-10000000, -257, -257, -257, -257, -257,-10000000,-10000000, -249, -229,-10000000, -264,-10000000, -202, -230, -230,-10000000,-10000000,-10000000, -241,-10000000,-10000000,-10000000, -247, -203,-10000000 }; LayYYtabelem LayYYpgo[]={ 0, 80, 70, 68, 76, 75, 66, 63, 62, 74, 67, 64, 65, 72 }; LayYYtabelem LayYYr1[]={ 0, 13, 1, 1, 1, 1, 3, 2, 2, 4, 4, 5, 5, 7, 7, 8, 8, 6, 6, 6, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 9, 9 }; LayYYtabelem LayYYr2[]={ 0, 3, 5, 5, 7, 3, 9, 5, 3, 15, 1, 9, 1, 5, 1, 5, 1, 5, 3, 3, 5, 5, 2, 5, 5, 7, 5, 3, 5, 7, 7, 7, 7, 7, 5, 5, 2, 3, 3 }; LayYYtabelem LayYYchk[]={ -10000000, -13, -3, -9, 266, 267, 257, -2, -1, 263, -10, -3, 271, 270, -11, 276, 277, 261, 264, 269, 258, -2, -4, 268, 259, -5, 259, -11, -11, 275, 263, 263, -12, 271, 270, -11, 263, -10, -7, 270, -7, 262, 270, 271, 272, 273, 274, -12, -12, -8, 271, -6, -11, 265, -8, -12, -12, -12, -12, -12, 272, -6, 265, 260, -7, -8, 260 }; LayYYtabelem LayYYdef[]={ 0, -2, 1, 0, 37, 38, 0, 0, 8, 10, 12, 5, 0, 0, 22, 0, 0, 0, 27, 0, 6, 7, 2, 0, 14, 3, 14, 20, 21, 26, 23, 24, 0, 0, 0, 36, 28, 4, 16, 0, 16, 25, 0, 0, 0, 0, 0, 34, 35, 0, 0, 13, 18, 19, 0, 29, 30, 31, 32, 33, 14, 15, 17, 11, 16, 0, 9 }; typedef struct #ifdef __cplusplus LayYYtoktype #endif { char *t_name; int t_val; } LayYYtoktype; #ifndef YYDEBUG # define YYDEBUG 0 /* don't allow debugging */ #endif #if YYDEBUG LayYYtoktype LayYYtoks[] = { "OC", 257, "CC", 258, "OA", 259, "CA", 260, "OP", 261, "CP", 262, "NAME", 263, "NUMBER", 264, "INFINITY", 265, "VERTICAL", 266, "HORIZONTAL", 267, "EQUAL", 268, "DOLLAR", 269, "PLUS", 270, "MINUS", 271, "TIMES", 272, "DIVIDE", 273, "PERCENTOF", 274, "PERCENT", 275, "WIDTH", 276, "HEIGHT", 277, "UMINUS", 278, "UPLUS", 279, "-unknown-", -1 /* ends search */ }; char * LayYYreds[] = { "-no such reduction-", "layout : compositebox", "box : NAME bothparams", "box : signedExpr oneparams", "box : NAME EQUAL signedExpr", "box : compositebox", "compositebox : orientation OC boxes CC", "boxes : box boxes", "boxes : box", "bothparams : OA opStretch opShrink TIMES opStretch opShrink CA", "bothparams : /* empty */", "oneparams : OA opStretch opShrink CA", "oneparams : /* empty */", "opStretch : PLUS glue", "opStretch : /* empty */", "opShrink : MINUS glue", "opShrink : /* empty */", "glue : simpleExpr INFINITY", "glue : simpleExpr", "glue : INFINITY", "signedExpr : MINUS simpleExpr", "signedExpr : PLUS simpleExpr", "signedExpr : simpleExpr", "simpleExpr : WIDTH NAME", "simpleExpr : HEIGHT NAME", "simpleExpr : OP expr CP", "simpleExpr : simpleExpr PERCENT", "simpleExpr : NUMBER", "simpleExpr : DOLLAR NAME", "expr : expr PLUS expr", "expr : expr MINUS expr", "expr : expr TIMES expr", "expr : expr DIVIDE expr", "expr : expr PERCENTOF expr", "expr : MINUS expr", "expr : PLUS expr", "expr : simpleExpr", "orientation : VERTICAL", "orientation : HORIZONTAL", }; #endif /* YYDEBUG */ #if !defined(lint) && !defined(__cplusplus) static char __yaccpar_sccsid1[] = "@(#) 03 Sep 1992 yaccpar 6.11 Copyr 1991 Sun Micro"; #endif /* ** Skeleton parser driver for yacc output */ /* ** yacc user known macros and defines */ #define YYERROR goto LayYYerrlab #define YYACCEPT return(0) #define YYABORT return(1) #define YYBACKUP( newtoken, newvalue )\ {\ if ( LayYYchar >= 0 || ( LayYYr2[ LayYYtmp ] >> 1 ) != 1 )\ {\ LayYYerror( "syntax error - cannot backup" );\ goto LayYYerrlab;\ }\ LayYYchar = newtoken;\ LayYYstate = *LayYYps;\ LayYYlval = newvalue;\ goto LayYYnewstate;\ } #define YYRECOVERING() (!!LayYYerrflag) #define YYNEW(type) malloc(sizeof(type) * LayYYnewmax) #define YYCOPY(to, from, type) \ (type *) memcpy(to, (char *) from, LayYYnewmax * sizeof(type)) #define YYENLARGE( from, type) \ (type *) realloc((char *) from, LayYYnewmax * sizeof(type)) #ifndef YYDEBUG # define YYDEBUG 1 /* make debugging available */ #endif /* ** user known globals */ int LayYYdebug; /* set to 1 to get debugging */ /* ** driver internal defines */ #define YYFLAG (-10000000) /* ** global variables used by the parser */ YYSTYPE *LayYYpv; /* top of value stack */ int *LayYYps; /* top of state stack */ int LayYYstate; /* current state */ int LayYYtmp; /* extra var (lasts between blocks) */ int LayYYnerrs; /* number of errors */ int LayYYerrflag; /* error recovery flag */ int LayYYchar; /* current input token number */ #ifdef YYNMBCHARS #define YYLEX() LayYYcvtok(LayYYlex()) /* ** LayYYcvtok - return a token if i is a wchar_t value that exceeds 255. ** If i<255, i itself is the token. If i>255 but the neither ** of the 30th or 31st bit is on, i is already a token. */ #if defined(__STDC__) || defined(__cplusplus) int LayYYcvtok(int i) #else int LayYYcvtok(i) int i; #endif { int first = 0; int last = YYNMBCHARS - 1; int mid; wchar_t j; if(i&0x60000000){/*Must convert to a token. */ if( LayYYmbchars[last].character < i ){ return i;/*Giving up*/ } while ((last>=first)&&(first>=0)) {/*Binary search loop*/ mid = (first+last)/2; j = LayYYmbchars[mid].character; if( j==i ){/*Found*/ return LayYYmbchars[mid].tvalue; }else if( j= 0; LayYY_i++ ) { if ( LayYYtoks[LayYY_i].t_val == LayYYchar ) break; } printf( "%s\n", LayYYtoks[LayYY_i].t_name ); } } #endif /* YYDEBUG */ if ( ++LayYY_ps >= &LayYYs[ LayYYmaxdepth ] ) /* room on stack? */ { /* ** reallocate and recover. Note that pointers ** have to be reset, or bad things will happen */ int LayYYps_index = (LayYY_ps - LayYYs); int LayYYpv_index = (LayYY_pv - LayYYv); int LayYYpvt_index = (LayYYpvt - LayYYv); int LayYYnewmax; #ifdef YYEXPAND LayYYnewmax = YYEXPAND(LayYYmaxdepth); #else LayYYnewmax = 2 * LayYYmaxdepth; /* double table size */ if (LayYYmaxdepth == YYMAXDEPTH) /* first time growth */ { char *newLayYYs = (char *)YYNEW(int); char *newLayYYv = (char *)YYNEW(YYSTYPE); if (newLayYYs != 0 && newLayYYv != 0) { LayYYs = YYCOPY(newLayYYs, LayYYs, int); LayYYv = YYCOPY(newLayYYv, LayYYv, YYSTYPE); } else LayYYnewmax = 0; /* failed */ } else /* not first time */ { LayYYs = YYENLARGE(LayYYs, int); LayYYv = YYENLARGE(LayYYv, YYSTYPE); if (LayYYs == 0 || LayYYv == 0) LayYYnewmax = 0; /* failed */ } #endif if (LayYYnewmax <= LayYYmaxdepth) /* tables not expanded */ { LayYYerror( "yacc stack overflow" ); YYABORT; } LayYYmaxdepth = LayYYnewmax; LayYY_ps = LayYYs + LayYYps_index; LayYY_pv = LayYYv + LayYYpv_index; LayYYpvt = LayYYv + LayYYpvt_index; } *LayYY_ps = LayYY_state; *++LayYY_pv = LayYYval; /* ** we have a new state - find out what to do */ LayYY_newstate: if ( ( LayYY_n = LayYYpact[ LayYY_state ] ) <= YYFLAG ) goto LayYYdefault; /* simple state */ #if YYDEBUG /* ** if debugging, need to mark whether new token grabbed */ LayYYtmp = LayYYchar < 0; #endif if ( ( LayYYchar < 0 ) && ( ( LayYYchar = YYLEX() ) < 0 ) ) LayYYchar = 0; /* reached EOF */ #if YYDEBUG if ( LayYYdebug && LayYYtmp ) { register int LayYY_i; printf( "Received token " ); if ( LayYYchar == 0 ) printf( "end-of-file\n" ); else if ( LayYYchar < 0 ) printf( "-none-\n" ); else { for ( LayYY_i = 0; LayYYtoks[LayYY_i].t_val >= 0; LayYY_i++ ) { if ( LayYYtoks[LayYY_i].t_val == LayYYchar ) break; } printf( "%s\n", LayYYtoks[LayYY_i].t_name ); } } #endif /* YYDEBUG */ if ( ( ( LayYY_n += LayYYchar ) < 0 ) || ( LayYY_n >= YYLAST ) ) goto LayYYdefault; if ( LayYYchk[ LayYY_n = LayYYact[ LayYY_n ] ] == LayYYchar ) /*valid shift*/ { LayYYchar = -1; LayYYval = LayYYlval; LayYY_state = LayYY_n; if ( LayYYerrflag > 0 ) LayYYerrflag--; goto LayYY_stack; } LayYYdefault: if ( ( LayYY_n = LayYYdef[ LayYY_state ] ) == -2 ) { #if YYDEBUG LayYYtmp = LayYYchar < 0; #endif if ( ( LayYYchar < 0 ) && ( ( LayYYchar = YYLEX() ) < 0 ) ) LayYYchar = 0; /* reached EOF */ #if YYDEBUG if ( LayYYdebug && LayYYtmp ) { register int LayYY_i; printf( "Received token " ); if ( LayYYchar == 0 ) printf( "end-of-file\n" ); else if ( LayYYchar < 0 ) printf( "-none-\n" ); else { for ( LayYY_i = 0; LayYYtoks[LayYY_i].t_val >= 0; LayYY_i++ ) { if ( LayYYtoks[LayYY_i].t_val == LayYYchar ) { break; } } printf( "%s\n", LayYYtoks[LayYY_i].t_name ); } } #endif /* YYDEBUG */ /* ** look through exception table */ { register int *LayYYxi = LayYYexca; while ( ( *LayYYxi != -1 ) || ( LayYYxi[1] != LayYY_state ) ) { LayYYxi += 2; } while ( ( *(LayYYxi += 2) >= 0 ) && ( *LayYYxi != LayYYchar ) ) ; if ( ( LayYY_n = LayYYxi[1] ) < 0 ) YYACCEPT; } } /* ** check for syntax error */ if ( LayYY_n == 0 ) /* have an error */ { /* no worry about speed here! */ switch ( LayYYerrflag ) { case 0: /* new error */ LayYYerror( "syntax error" ); goto skip_init; LayYYerrlab: /* ** get globals into registers. ** we have a user generated syntax type error */ LayYY_pv = LayYYpv; LayYY_ps = LayYYps; LayYY_state = LayYYstate; skip_init: LayYYnerrs++; /* FALLTHRU */ case 1: case 2: /* incompletely recovered error */ /* try again... */ LayYYerrflag = 3; /* ** find state where "error" is a legal ** shift action */ while ( LayYY_ps >= LayYYs ) { LayYY_n = LayYYpact[ *LayYY_ps ] + YYERRCODE; if ( LayYY_n >= 0 && LayYY_n < YYLAST && LayYYchk[LayYYact[LayYY_n]] == YYERRCODE) { /* ** simulate shift of "error" */ LayYY_state = LayYYact[ LayYY_n ]; goto LayYY_stack; } /* ** current state has no shift on ** "error", pop stack */ #if YYDEBUG # define _POP_ "Error recovery pops state %d, uncovers state %d\n" if ( LayYYdebug ) printf( _POP_, *LayYY_ps, LayYY_ps[-1] ); # undef _POP_ #endif LayYY_ps--; LayYY_pv--; } /* ** there is no state on stack with "error" as ** a valid shift. give up. */ YYABORT; case 3: /* no shift yet; eat a token */ #if YYDEBUG /* ** if debugging, look up token in list of ** pairs. 0 and negative shouldn't occur, ** but since timing doesn't matter when ** debugging, it doesn't hurt to leave the ** tests here. */ if ( LayYYdebug ) { register int LayYY_i; printf( "Error recovery discards " ); if ( LayYYchar == 0 ) printf( "token end-of-file\n" ); else if ( LayYYchar < 0 ) printf( "token -none-\n" ); else { for ( LayYY_i = 0; LayYYtoks[LayYY_i].t_val >= 0; LayYY_i++ ) { if ( LayYYtoks[LayYY_i].t_val == LayYYchar ) { break; } } printf( "token %s\n", LayYYtoks[LayYY_i].t_name ); } } #endif /* YYDEBUG */ if ( LayYYchar == 0 ) /* reached EOF. quit */ YYABORT; LayYYchar = -1; goto LayYY_newstate; } }/* end if ( LayYY_n == 0 ) */ /* ** reduction by production LayYY_n ** put stack tops, etc. so things right after switch */ #if YYDEBUG /* ** if debugging, print the string that is the user's ** specification of the reduction which is just about ** to be done. */ if ( LayYYdebug ) printf( "Reduce by (%d) \"%s\"\n", LayYY_n, LayYYreds[ LayYY_n ] ); #endif LayYYtmp = LayYY_n; /* value to switch over */ LayYYpvt = LayYY_pv; /* $vars top of value stack */ /* ** Look in goto table for next state ** Sorry about using LayYY_state here as temporary ** register variable, but why not, if it works... ** If LayYYr2[ LayYY_n ] doesn't have the low order bit ** set, then there is no action to be done for ** this reduction. So, no saving & unsaving of ** registers done. The only difference between the ** code just after the if and the body of the if is ** the goto LayYY_stack in the body. This way the test ** can be made before the choice of what to do is needed. */ { /* length of production doubled with extra bit */ register int LayYY_len = LayYYr2[ LayYY_n ]; if ( !( LayYY_len & 01 ) ) { LayYY_len >>= 1; LayYYval = ( LayYY_pv -= LayYY_len )[1]; /* $$ = $1 */ LayYY_state = LayYYpgo[ LayYY_n = LayYYr1[ LayYY_n ] ] + *( LayYY_ps -= LayYY_len ) + 1; if ( LayYY_state >= YYLAST || LayYYchk[ LayYY_state = LayYYact[ LayYY_state ] ] != -LayYY_n ) { LayYY_state = LayYYact[ LayYYpgo[ LayYY_n ] ]; } goto LayYY_stack; } LayYY_len >>= 1; LayYYval = ( LayYY_pv -= LayYY_len )[1]; /* $$ = $1 */ LayYY_state = LayYYpgo[ LayYY_n = LayYYr1[ LayYY_n ] ] + *( LayYY_ps -= LayYY_len ) + 1; if ( LayYY_state >= YYLAST || LayYYchk[ LayYY_state = LayYYact[ LayYY_state ] ] != -LayYY_n ) { LayYY_state = LayYYact[ LayYYpgo[ LayYY_n ] ]; } } /* save until reenter driver code */ LayYYstate = LayYY_state; LayYYps = LayYY_ps; LayYYpv = LayYY_pv; } /* ** code supplied by user is placed in this switch */ switch( LayYYtmp ) { case 1: # line 50 "laygram.y" { *dest = LayYYpvt[-0].bval; } break; case 2: # line 53 "laygram.y" { BoxPtr box = New(LBoxRec); box->nextSibling = 0; box->type = WidgetBox; box->params = *LayYYpvt[-0].pval; Dispose (LayYYpvt[-0].pval); box->u.widget.quark = LayYYpvt[-1].qval; LayYYval.bval = box; } break; case 3: # line 63 "laygram.y" { BoxPtr box = New(LBoxRec); box->nextSibling = 0; box->type = GlueBox; box->params = *LayYYpvt[-0].pval; Dispose (LayYYpvt[-0].pval); box->u.glue.expr = LayYYpvt[-1].eval; LayYYval.bval = box; } break; case 4: # line 73 "laygram.y" { BoxPtr box = New(LBoxRec); box->nextSibling = 0; box->type = VariableBox; box->u.variable.quark = LayYYpvt[-2].qval; box->u.variable.expr = LayYYpvt[-0].eval; LayYYval.bval = box; } break; case 5: # line 82 "laygram.y" { LayYYval.bval = LayYYpvt[-0].bval; } break; case 6: # line 87 "laygram.y" { BoxPtr box = New(LBoxRec); BoxPtr child; box->nextSibling = 0; box->parent = 0; box->type = BoxBox; box->u.box.dir = LayYYpvt[-3].lval; box->u.box.firstChild = LayYYpvt[-1].bval; for (child = LayYYpvt[-1].bval; child; child = child->nextSibling) { if (child->type == GlueBox) { child->params.stretch[!LayYYpvt[-3].lval].expr = 0; child->params.shrink[!LayYYpvt[-3].lval].expr = 0; child->params.stretch[!LayYYpvt[-3].lval].order = 100000; child->params.shrink[!LayYYpvt[-3].lval].order = 100000; child->params.stretch[!LayYYpvt[-3].lval].value = 1; child->params.shrink[!LayYYpvt[-3].lval].value = 1; } child->parent = box; } LayYYval.bval = box; } break; case 7: # line 113 "laygram.y" { LayYYpvt[-1].bval->nextSibling = LayYYpvt[-0].bval; LayYYval.bval = LayYYpvt[-1].bval; } break; case 8: # line 118 "laygram.y" { LayYYval.bval = LayYYpvt[-0].bval; } break; case 9: # line 121 "laygram.y" { BoxParamsPtr p = New(BoxParamsRec); p->stretch[LayoutHorizontal] = LayYYpvt[-5].gval; p->shrink[LayoutHorizontal] = LayYYpvt[-4].gval; p->stretch[LayoutVertical] = LayYYpvt[-2].gval; p->shrink[LayoutVertical] = LayYYpvt[-1].gval; LayYYval.pval = p; } break; case 10: # line 131 "laygram.y" { BoxParamsPtr p = New(BoxParamsRec); ZeroGlue (p->stretch[LayoutHorizontal]); ZeroGlue (p->shrink[LayoutHorizontal]); ZeroGlue (p->stretch[LayoutVertical]); ZeroGlue (p->shrink[LayoutVertical]); LayYYval.pval = p; } break; case 11: # line 142 "laygram.y" { BoxParamsPtr p = New(BoxParamsRec); p->stretch[LayoutHorizontal] = LayYYpvt[-2].gval; p->shrink[LayoutHorizontal] = LayYYpvt[-1].gval; p->stretch[LayoutVertical] = LayYYpvt[-2].gval; p->shrink[LayoutVertical] = LayYYpvt[-1].gval; LayYYval.pval = p; } break; case 12: # line 152 "laygram.y" { BoxParamsPtr p = New(BoxParamsRec); ZeroGlue (p->stretch[LayoutHorizontal]); ZeroGlue (p->shrink[LayoutHorizontal]); ZeroGlue (p->stretch[LayoutVertical]); ZeroGlue (p->shrink[LayoutVertical]); LayYYval.pval = p; } break; case 13: # line 163 "laygram.y" { LayYYval.gval = LayYYpvt[-0].gval; } break; case 14: # line 165 "laygram.y" { ZeroGlue (LayYYval.gval); } break; case 15: # line 168 "laygram.y" { LayYYval.gval = LayYYpvt[-0].gval; } break; case 16: # line 170 "laygram.y" { ZeroGlue (LayYYval.gval); } break; case 17: # line 173 "laygram.y" { LayYYval.gval.order = LayYYpvt[-0].ival; LayYYval.gval.expr = LayYYpvt[-1].eval; } break; case 18: # line 175 "laygram.y" { LayYYval.gval.order = 0; LayYYval.gval.expr = LayYYpvt[-0].eval; } break; case 19: # line 177 "laygram.y" { LayYYval.gval.order = LayYYpvt[-0].ival; LayYYval.gval.expr = 0; LayYYval.gval.value = 1; } break; case 20: # line 180 "laygram.y" { LayYYval.eval = New(ExprRec); LayYYval.eval->type = Unary; LayYYval.eval->u.unary.op = LayYYpvt[-1].oval; LayYYval.eval->u.unary.down = LayYYpvt[-0].eval; } break; case 21: # line 187 "laygram.y" { LayYYval.eval = LayYYpvt[-0].eval; } break; case 23: # line 191 "laygram.y" { LayYYval.eval = New(ExprRec); LayYYval.eval->type = Width; LayYYval.eval->u.width = LayYYpvt[-0].qval; } break; case 24: # line 196 "laygram.y" { LayYYval.eval = New(ExprRec); LayYYval.eval->type = Height; LayYYval.eval->u.height = LayYYpvt[-0].qval; } break; case 25: # line 201 "laygram.y" { LayYYval.eval = LayYYpvt[-1].eval; } break; case 26: # line 203 "laygram.y" { LayYYval.eval = New(ExprRec); LayYYval.eval->type = Unary; LayYYval.eval->u.unary.op = LayYYpvt[-0].oval; LayYYval.eval->u.unary.down = LayYYpvt[-1].eval; } break; case 27: # line 210 "laygram.y" { LayYYval.eval = New(ExprRec); LayYYval.eval->type = Constant; LayYYval.eval->u.constant = LayYYpvt[-0].ival; } break; case 28: # line 215 "laygram.y" { LayYYval.eval = New(ExprRec); LayYYval.eval->type = Variable; LayYYval.eval->u.variable = LayYYpvt[-0].qval; } break; case 29: # line 221 "laygram.y" { binary: ; LayYYval.eval = New(ExprRec); LayYYval.eval->type = Binary; LayYYval.eval->u.binary.op = LayYYpvt[-1].oval; LayYYval.eval->u.binary.left = LayYYpvt[-2].eval; LayYYval.eval->u.binary.right = LayYYpvt[-0].eval; } break; case 30: # line 229 "laygram.y" { goto binary; } break; case 31: # line 231 "laygram.y" { goto binary; } break; case 32: # line 233 "laygram.y" { goto binary; } break; case 33: # line 235 "laygram.y" { goto binary; } break; case 34: # line 237 "laygram.y" { unary: ; LayYYval.eval = New(ExprRec); LayYYval.eval->type = Unary; LayYYval.eval->u.unary.op = LayYYpvt[-1].oval; LayYYval.eval->u.unary.down = LayYYpvt[-0].eval; } break; case 35: # line 244 "laygram.y" { LayYYval.eval = LayYYpvt[-0].eval; } break; case 37: # line 248 "laygram.y" { LayYYval.lval = LayoutVertical; } break; case 38: # line 250 "laygram.y" { LayYYval.lval = LayoutHorizontal; } break; } goto LayYYstack; /* reset registers in driver code */ }