Annotation of researchv10no/cmd/picasso/picassoy.y, revision 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.