Annotation of researchv10no/cmd/picasso/picassoy.y, revision 1.1.1.1

1.1       root        1: %{
                      2: #include "picasso.h"
                      3: YYSTYPE        y;
                      4: %}
                      5: 
                      6: %token <i>     BOX       1     /* DON'T CHANGE THESE!          */
                      7: %token <i>     LINE      2     /* (or at least use care; some  */
                      8: %token <i>     ARROW     3     /* code requires real primitves */
                      9: %token <i>     CIRCLE    4     /* to have token value <= TEXT  */
                     10: %token <i>     ELLIPSE   5     /* (these have bounding boxes & */
                     11: %token <i>     ARC       6     /* line & color attributes.)    */
                     12: %token <i>     SECTOR    7
                     13: %token <i>     SPLINE    8
                     14: %token <i>     BLOCK     9
                     15: %token <i>     PSFILE   10
                     16: %token <p>     TEXT     11
                     17: %token <i>     TROFF    12
                     18: %token <i>     MOVE     13
                     19: %token <i>     BLOCKEND 14
                     20: %token <i>     PLACE    15
                     21: %token <i>     OBJECT   16
                     22: %token <i>     TEXTOBJ  17
                     23: %token <i>     PRINT RESET SHOW THRU UNTIL
                     24: %token <o>     FOR IF COPY
                     25: %token <o>     DUP DELETE
                     26: %token <p>     THENSTR ELSESTR DOSTR DEFNAME PLACENAME VARNAME SPRINTF
                     27: %token <i>     ATTR TEXTATTR LAYER COLOR LCOLOR PCOLOR TCOLOR LWEIGHT NOEDGE
                     28: %token <i>     LEFT RIGHT UP DOWN FONT SIZE SPACE
                     29: %token <p>     TEXTVAR
                     30: %token <i>     FROM TO AT BY WITH HEAD CW CCW THEN
                     31: %token <i>     HEIGHT WIDTH RADIUS DIAMETER LENGTH LOCUS XLIST YLIST
                     32: %token <i>     CORNER HERE LAST NTH DOTNTH SAME BETWEEN AND
                     33: %token <i>     EAST WEST NORTH SOUTH NE NW SE SW START END
                     34: %token <i>     TRANSFORM TRANSLATE ROTATE SCALE REFLECT
                     35: %token <i>     DOTX DOTY DOTHT DOTWID DOTRAD
                     36: %token <f>     NUMBER
                     37: %token <f>     ABS LOG LOG10 EXP POW SIN COS ATAN2 SQRT
                     38: %token <f>     RAND MIN MAX INT RGB SETFONT
                     39: %token <i>     DIR
                     40: %token <i>     DOT DASH DASHPAT CHOP
                     41: %token <o>     ST      /* statement terminator */
                     42: 
                     43: %right <f>     '='
                     44: %left  <f>     OROR
                     45: %left  <f>     ANDAND
                     46: %nonassoc <f>  GT LT LE GE EQ NEQ
                     47: %left  <f>     '+' '-'
                     48: %left  <f>     '*' '/' '%'
                     49: %right <f>     UMINUS NOT
                     50: 
                     51: %type  <f>     expr if_expr asgn
                     52: %type  <p>     text
                     53: %type  <i>     atto optby optop exprlist
                     54: %type  <o>     if for copy
                     55: 
                     56: %type  <o>     leftbrace picture piclist position lbracket
                     57: %type  <o>     prim place objname blockname show transform dup
                     58: %type  <i>     textlist textattr       /* not a sensible value */
                     59: %type  <i>     last type
                     60: 
                     61: %%
                     62: 
                     63: top:
                     64:          piclist
                     65:        | /* empty */
                     66:        | error         { yyerror("syntax error"); }
                     67:        ;
                     68: 
                     69: piclist:
                     70:          picture
                     71:        | piclist picture
                     72:        ;
                     73: 
                     74: picture:
                     75:          prim ST                       { codegen = 1; makeiattr(0, 0); }
                     76:        | leftbrace piclist '}'         { rightthing($1, '}'); $$ = $2; }
                     77:        | PLACENAME ':' picture         { $$=y.o=$3; makevar($1,PLACENAME,y); }
                     78:        | PLACENAME ':' ST picture      { $$=y.o=$4; makevar($1,PLACENAME,y); }
                     79:        | PLACENAME ':' position ST     { $$=y.o=$3; makevar($1,PLACENAME,y); }
                     80:        | asgn ST                       { y.f = $1; /* ??? */ $$ = y.o; }
                     81:        | dup ST
                     82:        | transform ST
                     83:        | DIR                           { setdir($1); }
                     84:        | PRINT expr ST                 { printexpr($2); }
                     85:        | PRINT position ST             { printpos($2); }
                     86:        | PRINT text ST                 { fprintf(stderr,"%s\n",$2);free($2); }
                     87:        | RESET varlist ST              { resetvar(); makeiattr(0, 0); }
                     88:        | DELETE objname ST             { freenode($2); }
                     89:        | show ST
                     90:        | copy ST
                     91:        | for
                     92:        | if
                     93:        | ST
                     94:        ;
                     95: 
                     96: varlist:
                     97:          /* empty */
                     98:        | VARNAME                       { makevattr($1); }
                     99:        | varlist VARNAME               { makevattr($2); }
                    100:        | varlist ',' VARNAME           { makevattr($3); }
                    101:        ;
                    102: 
                    103: dup:
                    104:          DUP objname atto '(' VARNAME ',' VARNAME ')' { $$=copyobj($2,$5,$7); }
                    105:        | DUP objname atto position                     { $$ = copypos($2,$4); }
                    106:        | DUP objname                                   { $$ = copypos($2,$2); }
                    107: 
                    108: copy:
                    109:          COPY copylist                                 {/* lexical */ copy(); }
                    110:        ;
                    111: 
                    112: atto:
                    113:          AT
                    114:        | TO
                    115:        ;
                    116: 
                    117: copylist:
                    118:          copyattr
                    119:        | copylist copyattr
                    120:        ;
                    121: copyattr:
                    122:          text                  { copyfile($1); }
                    123:        | THRU DEFNAME          { copydef($2); }
                    124:        | UNTIL text            { copyuntil($2); }
                    125:        ;
                    126: 
                    127: show:
                    128:          SHOW expr FROM position TO position
                    129:                                { if (batch) print_layer_bnd($2, $4, $6); }
                    130:        | SHOW FROM position TO position
                    131:                                { if (batch) print_bnd($3, $5); }
                    132:        | SHOW objname          { if (batch) print_obj($2); }
                    133:        | SHOW expr             { if (batch) print_layer($2); }
                    134:        | SHOW                  { if (batch) print(0); }
                    135: 
                    136: for:
                    137:          FOR VARNAME FROM expr TO expr BY optop expr DOSTR
                    138:                { forloop($2, $4, $6, $8, $9, $10); }
                    139:        | FOR VARNAME FROM expr TO expr DOSTR
                    140:                { forloop($2, $4, $6, '+', 1.0, $7); }
                    141:        | FOR VARNAME '=' expr TO expr BY optop expr DOSTR
                    142:                { forloop($2, $4, $6, $8, $9, $10); }
                    143:        | FOR VARNAME '=' expr TO expr DOSTR
                    144:                { forloop($2, $4, $6, '+', 1.0, $7); }
                    145:        ;
                    146: 
                    147: if:
                    148:          IF if_expr THENSTR ELSESTR    { ifstat($2, $3, $4); }
                    149:        | IF if_expr THENSTR            { ifstat($2, $3, (char *) 0); }
                    150:        ;
                    151: if_expr:
                    152:          expr
                    153:        | text EQ text          { $$ = strcmp($1,$3) == 0; free($1); free($3); }
                    154:        | text NEQ text         { $$ = strcmp($1,$3) != 0; free($1); free($3); }
                    155:        ;
                    156: 
                    157: optop:
                    158:          '+'           { $$ = '+'; }
                    159:        | '-'           { $$ = '-'; }
                    160:        | '*'           { $$ = '*'; }
                    161:        | '/'           { $$ = '/'; }
                    162:        | /* empty */   { $$ = ' '; }
                    163:        ;
                    164: 
                    165: 
                    166: leftbrace:
                    167:          '{'                   { $$ = leftthing('{'); }
                    168:        ;
                    169: 
                    170: prim:
                    171:          BOX attrlist          { $$ = boxgen(); }
                    172:        | CIRCLE attrlist       { $$ = circgen($1); }
                    173:        | ELLIPSE attrlist      { $$ = circgen($1); }
                    174:        | ARC attrlist          { $$ = arcgen($1); }
                    175:        | SECTOR attrlist       { $$ = arcgen($1); }
                    176:        | LINE attrlist         { $$ = linegen($1); }
                    177:        | ARROW attrlist        { $$ = linegen($1); }
                    178:        | SPLINE attrlist       { $$ = linegen($1); }
                    179:        | MOVE attrlist         { $$ = movegen(); }
                    180:        | PSFILE attrlist       { $$ = picgen(); }
                    181:        | textlist attrlist     { $$ = textgen(); }
                    182:        | TROFF                 { $$ = troffgen($1); }
                    183:        | lbracket piclist ']' { $<o>$=rightthing($1,']'); } attrlist
                    184:                                { $$ = blockgen($1); }
                    185:        ;
                    186: 
                    187: lbracket:
                    188:          '['                   { $$ = leftthing('['); }
                    189:        ;
                    190: 
                    191: attrlist:
                    192:          attrlist attr
                    193:        | /* empty */
                    194:        ;
                    195: 
                    196: attr:
                    197:          ATTR expr             { makefattr($1, !DEFAULT, $2); }
                    198:        | ATTR                  { makefattr($1, DEFAULT, 0.0); }
                    199:        | COLOR expr            { makefattr($1, !DEFAULT, checkcolor($2)); }
                    200:        | COLOR                 { makefattr($1, DEFAULT, 0.0); }
                    201:        | expr                  { makefattr(curdir(), !DEFAULT, $1); }
                    202:        | DIR expr              { makefattr($1, !DEFAULT, $2); }
                    203:        | DIR                   { makefattr($1, DEFAULT, 0.0); }
                    204:        | FROM position                         { makeoattr($1, $2); }
                    205:        | LOCUS '(' VARNAME ',' VARNAME ')'     { makelattr($3, $5); }
                    206:        | TO position                           { makeoattr($1, $2); }
                    207:        | AT position                           { makeoattr($1, $2); }
                    208:        | BY position                           { makeoattr($1, $2); }
                    209:        | WITH CORNER                           { makeiattr(WITH, $2); }
                    210:        | WITH DOTNTH                           { makeiattr(WITH, $2); }
                    211:        | WITH '.' PLACENAME
                    212:                { makeoattr(PLACE,getblock(getlast(1,BLOCK),$3)); }
                    213:        | WITH '.' PLACENAME CORNER
                    214:                { makeoattr(PLACE,getpos(getblock(getlast(1,BLOCK),$3),$4)); }
                    215:        | WITH position         { makeoattr(PLACE, $2); /* ??? */ }
                    216:        | SAME                  { makeiattr(SAME, $1); }
                    217:        | FONT expr             { makefattr($1, !DEFAULT, checkfont($2)); } 
                    218:        | FONT TEXT             { makefattr($1, !DEFAULT, setfont($2)); } 
                    219:        | SIZE optop expr       { makefattr($1, $2, $3); }
                    220:        | SPACE optop expr      { makefattr($1, $2, $3); }
                    221:        | TEXTATTR              { maketattr($1, (char *) 0); }
                    222:        | HEAD                  { makeiattr(HEAD, $1); }
                    223:        | CHOP                  { makefattr(CHOP, DEFAULT, -1.0); }
                    224:        | CHOP expr             { makefattr(CHOP, !DEFAULT, $2); }
                    225:        | DOT                   { makefattr(DOT, DEFAULT, 0.0); }
                    226:        | DOT expr              { makefattr(DOT, !DEFAULT, $2); }
                    227:        | DASH                  { makefattr(DASH, DEFAULT, 0.0); }
                    228:        | DASH expr             { makefattr(DASH, !DEFAULT, $2); }
                    229:        | DASHPAT VARNAME               { makedattr($2); }
                    230:        | DASHPAT '(' exprlist ')'      { makedattr((char *)0); }
                    231:        | textlist
                    232:        ;
                    233: 
                    234: textlist:
                    235:          textattr
                    236:        | textlist textattr
                    237:        ;
                    238: textattr:
                    239:          text                  { maketattr(DEFAULT, $1); }
                    240:        | text TEXTATTR         { maketattr($2, $1); }
                    241:        | textattr TEXTATTR     { addtattr($2); }
                    242:        ;
                    243: text:
                    244:          TEXT
                    245:        | SPRINTF '(' text ')'                  { $$ = sprintgen($3); }
                    246:        | SPRINTF '(' text ',' exprlist ')'     { $$ = sprintgen($3); }
                    247:        ;
                    248: 
                    249: exprlist:
                    250:          '(' exprlist ')'      { $$ = $2; }
                    251:        | expr                  { $$ = exprsave($1); }
                    252:        | exprlist  expr        { $$ = exprsave($2); }
                    253:        | exprlist ',' expr     { $$ = exprsave($3); }
                    254:        ;
                    255: 
                    256: position:              /* absolute, not relative */
                    257:          place
                    258:        | '(' position ')'                      { $$ = $2; }
                    259:        | expr ',' expr                         { $$ = makepos($1, $3,
                    260:                                                                0, (obj *)0); }
                    261:        | position '+' expr ',' expr            { $$ = fixpos($1,  $3,  $5);  }
                    262:        | position '-' expr ',' expr            { $$ = fixpos($1, -$3, -$5);  }
                    263:        | position '+' '(' expr ',' expr ')'    { $$ = fixpos($1,  $4,  $6);  }
                    264:        | position '-' '(' expr ',' expr ')'    { $$ = fixpos($1, -$4, -$6);  }
                    265:        | position '+' place                    { $$ = addpos($1, $3); }
                    266:        | position '-' place                    { $$ = subpos($1, $3); }
                    267:        | '(' place ',' place ')'
                    268:                        { $$ = makepos(getcomp($2,DOTX), getcomp($4,DOTY),
                    269:                                                                0, (obj *)0); }
                    270:        | expr LT position ',' position GT      { $$ = makebetween($1,$3,$5); }
                    271:        | expr BETWEEN position AND position    { $$ = makebetween($1,$3,$5); }
                    272:        ;
                    273: 
                    274: place:
                    275:          objname               { $$ = getpos($1, -1); }
                    276:        | objname CORNER        { $$ = getpos($1, $2); }
                    277:        | CORNER objname        { $$ = getpos($2, $1); }
                    278:        | objname DOTNTH        { $$ = getnth($1, $2); }
                    279:        | HERE                  { $$ = gethere(); }
                    280:        ;
                    281: 
                    282: objname:
                    283:          PLACENAME             { y = getvar($1); $$ = y.o; }
                    284:        | last type             { $$ = getlast($1, $2); }
                    285:        | NTH type              { $$ = getfirst($1, $2); }
                    286:        | blockname
                    287:        ;
                    288: 
                    289: blockname:
                    290:          last BLOCK '.' PLACENAME      { $$ = getblock(getlast($1,$2), $4); }
                    291:        | NTH BLOCK '.' PLACENAME       { $$ = getblock(getfirst($1,$2), $4); }
                    292:        | PLACENAME '.' PLACENAME       { y=getvar($1); $$=getblock(y.o, $3); }
                    293:        ;
                    294: 
                    295: last:
                    296:          last LAST             { $$ = $1 + 1; }
                    297:        | NTH LAST              { $$ = $1; }
                    298:        | LAST                  { $$ = 1; }
                    299:        ;
                    300: 
                    301: type:
                    302:          BOX
                    303:        | CIRCLE
                    304:        | ELLIPSE
                    305:        | ARC
                    306:        | SECTOR
                    307:        | LINE
                    308:        | ARROW
                    309:        | SPLINE
                    310:        | BLOCK
                    311:        | OBJECT
                    312:        | PSFILE
                    313:        | TEXTOBJ
                    314:        ;
                    315: 
                    316: transform:
                    317:          TRANSLATE place optby position
                    318:                                { $$=$2; xlate($2, $4); }
                    319:        | MOVE place TO position
                    320:                                { $$=$2; xlate_to($2, $4); }
                    321:        | TRANSLATE optby position
                    322:                                { y=getvar("O"); $$=y.o; xlate(y.o,$3); }
                    323:        | SCALE '=' expr        { rescale($3);   }
                    324:        | SCALE place optby exprlist
                    325:                                { $$=$2; scale($2, $4, $2); }
                    326:        | SCALE optby exprlist
                    327:                                { y=getvar("O"); $$=y.o; scale(y.o,$3,NULL); }
                    328:        | SCALE place optby exprlist AT position
                    329:                                { $$=$2; scale($2, $4, $6); }
                    330:        | SCALE optby exprlist AT position
                    331:                                { y=getvar("O"); $$=y.o; scale(y.o,$3,$5); }
                    332:        | ROTATE place optby expr
                    333:                                { $$=$2; rotate($2, $4, $2); }
                    334:        | ROTATE optby expr
                    335:                                { y=getvar("O"); $$=y.o; rotate(y.o,$3,NULL); }
                    336:        | ROTATE place optby expr AT position
                    337:                                { $$=$2; rotate($2, $4, $6); }
                    338:        | ROTATE optby expr AT position
                    339:                                { y=getvar("O"); $$=y.o; rotate(y.o,$3,$5); }
                    340:        | REFLECT place
                    341:                                { $$=$2; reflect($2,$2); }
                    342:        | REFLECT place AT position
                    343:                                { $$=$2; reflect($2,$4); }
                    344:        | REFLECT AT position
                    345:                                { y=getvar("O"); $$=y.o; reflect(y.o,$3); }
                    346:        | TRANSFORM place optby exprlist
                    347:                                { $$=$2; xform($2,$4); }
                    348:        | TRANSFORM optby exprlist
                    349:                                { y=getvar("O"); $$=y.o; xform(y.o,$3); }
                    350:        ;
                    351: 
                    352: optby:
                    353:          BY                    { $$ = BY; }
                    354:        |                       { $$ = ' '; }
                    355:        ;
                    356: 
                    357: asgn:
                    358:          VARNAME '=' exprlist                  { $$ = setarray($1); }
                    359:        | VARNAME DOTNTH '=' expr               { $$ = setvar($1,$2,$4); }
                    360:        | TEXTVAR '=' expr                      { $$ = setsize($1,$3); }
                    361: /*     | ATTR '(' objname ')' '=' expr         { $$ = setattr($3,$1,$6);} */
                    362: /*     | COLOR '(' objname ')' '=' expr        { $$ = setattr($3,$1,$6);} */
                    363:        ;
                    364: 
                    365: expr:
                    366:          NUMBER
                    367:        | VARNAME DOTNTH        { $$ = getsub($1,$2); free($1); }
                    368:        | VARNAME               { $$ = getfval($1); free($1); }
                    369:        | TEXTVAR               { $$ = getfval($1); free($1); }
                    370:        | asgn
                    371:        | expr '+' expr         { $$ = $1 + $3; }
                    372:        | expr '-' expr         { $$ = $1 - $3; }
                    373:        | expr '*' expr         { $$ = $1 * $3; }
                    374:        | expr '/' expr         { if ($3 == 0.0) {
                    375:                                        yyerror("division by 0"); $3 = 1; }
                    376:                                  $$ = $1 / $3; }
                    377:        | expr '%' expr         { if ((long)$3 == 0) {
                    378:                                        yyerror("mod division by 0"); $3 = 1; }
                    379:                                  $$ = (long)$1 % (long)$3; }
                    380:        | '-' expr %prec UMINUS { $$ = -$2; }
                    381:        | '(' expr ')'          { $$ = $2; }
                    382:        | place DOTX            { $$ = getcomp($1, $2); }
                    383:        | place DOTY            { $$ = getcomp($1, $2); }
                    384:        | place DOTHT           { $$ = getcomp($1, $2); }
                    385:        | place DOTWID          { $$ = getcomp($1, $2); }
                    386:        | place DOTRAD          { $$ = getcomp($1, $2) / 2.0; }
                    387:        | PLACENAME '.' VARNAME { y = getvar($1); $$ = getblkvar(y.o, $3); }
                    388:        | last BLOCK '.' VARNAME { $$ = getblkvar(getlast($1,$2), $4); }
                    389:        | NTH BLOCK '.' VARNAME { $$ = getblkvar(getfirst($1,$2), $4); }
                    390:        | expr GT expr          { $$ = $1 > $3; }
                    391:        | expr LT expr          { $$ = $1 < $3; }
                    392:        | expr LE expr          { $$ = $1 <= $3; }
                    393:        | expr GE expr          { $$ = $1 >= $3; }
                    394:        | expr EQ expr          { $$ = $1 == $3; }
                    395:        | expr NEQ expr         { $$ = $1 != $3; }
                    396:        | expr ANDAND expr      { $$ = $1 && $3; }
                    397:        | expr OROR expr        { $$ = $1 || $3; }
                    398:        | NOT expr              { $$ = !($2); }
                    399:        | ABS '(' expr ')'              { $$ = fabs($3); }
                    400:        | LOG '(' expr ')'              { $$ = Log($3); }
                    401:        | LOG10 '(' expr ')'            { $$ = Log10($3); }
                    402:        | EXP '(' expr ')'              { $$ = Exp($3); }
                    403:        | SIN '(' expr ')'              { $$ = Sin($3); }
                    404:        | COS '(' expr ')'              { $$ = Cos($3); }
                    405:        | POW '(' expr ',' expr ')'     { $$ = Pow($3, $5); }
                    406:        | ATAN2 '(' expr ',' expr ')'   { $$ = Atan2($3, $5); }
                    407:        | SQRT '(' expr ')'             { $$ = Sqrt($3); }
                    408:        | RAND '(' ')'                  { $$ = (float)rand() / 32767.0; /* might be 2^31-1 */ }
                    409:        | MAX '(' VARNAME ')'           { $$ = Maxvar($3); }
                    410:        | MAX '(' exprlist ')'          { $$ = Maxlist(); }
                    411:        | MIN '(' VARNAME ')'           { $$ = Minvar($3); }
                    412:        | MIN '(' exprlist ')'          { $$ = Minlist(); }
                    413:        | INT '(' expr ')'              { $$ = (long) $3; }
                    414:        | RGB '(' exprlist ')'          { $$ = setrgbindex(); }
                    415:        | SETFONT '(' TEXT ')'          { $$ = setfont($3); }
                    416:        ;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.