Annotation of researchv10no/cmd/pic/picy.y, revision 1.1

1.1     ! root        1: %{
        !             2: #include <stdio.h>
        !             3: #include "pic.h"
        !             4: #include <math.h>
        !             5: #include <stdlib.h>
        !             6: #include <string.h>
        !             7: 
        !             8: YYSTYPE        y;
        !             9: 
        !            10: extern void    yyerror(char *);
        !            11: extern int     yylex(void);
        !            12: %}
        !            13: 
        !            14: %token <i>     BOX     1       /* DON'T CHANGE THESE! */
        !            15: %token <i>     LINE    2
        !            16: %token <i>     ARROW   3
        !            17: %token <i>     CIRCLE  4
        !            18: %token <i>     ELLIPSE 5
        !            19: %token <i>     ARC     6
        !            20: %token <i>     SPLINE  7
        !            21: %token <i>     BLOCK   8
        !            22: %token <p>     TEXT    9
        !            23: %token <p>     TROFF   10
        !            24: %token <i>     MOVE    11
        !            25: %token <i>     BLOCKEND 12
        !            26: %token <i>     PLACE   13
        !            27: %token <i>     PRINT RESET THRU UNTIL
        !            28: %token <o>     FOR IF COPY
        !            29: %token <p>     THENSTR ELSESTR DOSTR PLACENAME VARNAME SPRINTF
        !            30: %token <st>    DEFNAME
        !            31: %token <i>     ATTR TEXTATTR
        !            32: %token <i>     LEFT RIGHT UP DOWN FROM TO AT BY WITH HEAD CW CCW THEN
        !            33: %token <i>     HEIGHT WIDTH RADIUS DIAMETER LENGTH SIZE
        !            34: %token <i>     CORNER HERE LAST NTH SAME BETWEEN AND
        !            35: %token <i>     EAST WEST NORTH SOUTH NE NW SE SW START END
        !            36: %token <i>     DOTX DOTY DOTHT DOTWID DOTRAD
        !            37: %token <f>     NUMBER
        !            38: %token <f>     LOG EXP SIN COS ATAN2 SQRT RAND MIN MAX INT
        !            39: %token <i>     DIR
        !            40: %token <i>     DOT DASH CHOP FILL NOEDGE
        !            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: %right <f>     '^'
        !            51: 
        !            52: %type  <f>     expr if_expr asgn
        !            53: %type  <p>     name text
        !            54: %type  <i>     optop exprlist
        !            55: %type  <o>     if for copy
        !            56: 
        !            57: /* this is a lie:  picture and position are really the whole union */
        !            58: %type  <o>     leftbrace picture piclist position lbracket
        !            59: %type  <o>     prim place blockname
        !            60: %type  <i>     textlist textattr       /* not a sensible value */
        !            61: %type  <i>     last type
        !            62: 
        !            63: %%
        !            64: 
        !            65: top:
        !            66:          piclist
        !            67:        | /* empty */
        !            68:        | error         { ERROR "syntax error" WARNING; }
        !            69:        ;
        !            70: 
        !            71: piclist:
        !            72:          picture
        !            73:        | piclist picture
        !            74:        ;
        !            75: 
        !            76: picture:
        !            77:          prim ST                       { codegen = 1; makeiattr(0, 0); }
        !            78:        | leftbrace piclist '}'         { rightthing($1, '}'); $$ = $2; }
        !            79:        | PLACENAME ':' picture         { y.o=$3; makevar($1,PLACENAME,y); $$ = $3; }
        !            80:        | PLACENAME ':' ST picture      { y.o=$4; makevar($1,PLACENAME,y); $$ = $4; }
        !            81:        | PLACENAME ':' position ST     { y.o=$3; makevar($1,PLACENAME,y); $$ = $3; }
        !            82:        | asgn ST                       { y.f = $1; $$ = y.o; $$ = makenode(PLACE, 0); }
        !            83:        | DIR                           { setdir($1); $$ = makenode(PLACE, 0); }
        !            84:        | PRINT expr ST                 { printexpr($2); $$ = makenode(PLACE, 0); }
        !            85:        | PRINT position ST             { printpos($2); $$ = makenode(PLACE, 0); }
        !            86:        | PRINT text ST                 { printf("%s\n", $2); free($2); $$ = makenode(PLACE, 0); }
        !            87:        | RESET varlist ST              { resetvar(); makeiattr(0, 0); $$ = makenode(PLACE, 0); }
        !            88:        | copy
        !            89:        | for
        !            90:        | if
        !            91:        | ST
        !            92:        ;
        !            93: 
        !            94: varlist:
        !            95:          /* empty */
        !            96:        | VARNAME               { makevattr($1); }
        !            97:        | varlist VARNAME       { makevattr($2); }
        !            98:        | varlist ',' VARNAME   { makevattr($3); }
        !            99:        ;
        !           100: 
        !           101: asgn:
        !           102:          VARNAME '=' expr      { $$=y.f=$3; makevar($1,VARNAME,y); checkscale($1); }
        !           103:        ;
        !           104: 
        !           105: copy:
        !           106:          COPY copylist         { copy(); }
        !           107:        ;
        !           108: copylist:
        !           109:          copyattr
        !           110:        | copylist copyattr
        !           111:        ;
        !           112: copyattr:
        !           113:          text                  { copyfile($1); }
        !           114:        | THRU DEFNAME          { copydef($2); }
        !           115:        | UNTIL text            { copyuntil($2); }
        !           116:        ;
        !           117: 
        !           118: for:
        !           119:          FOR name FROM expr TO expr BY optop expr DOSTR
        !           120:                { forloop($2, $4, $6, $8, $9, $10); }
        !           121:        | FOR name FROM expr TO expr DOSTR
        !           122:                { forloop($2, $4, $6, '+', 1.0, $7); }
        !           123:        | FOR name '=' expr TO expr BY optop expr DOSTR
        !           124:                { forloop($2, $4, $6, $8, $9, $10); }
        !           125:        | FOR name '=' expr TO expr DOSTR
        !           126:                { forloop($2, $4, $6, '+', 1.0, $7); }
        !           127:        ;
        !           128: 
        !           129: if:
        !           130:          IF if_expr THENSTR ELSESTR    { ifstat($2, $3, $4); }
        !           131:        | IF if_expr THENSTR            { ifstat($2, $3, (char *) 0); }
        !           132:        ;
        !           133: if_expr:
        !           134:          expr
        !           135:        | text EQ text          { $$ = strcmp($1,$3) == 0; free($1); free($3); }
        !           136:        | text NEQ text         { $$ = strcmp($1,$3) != 0; free($1); free($3); }
        !           137:        ;
        !           138: 
        !           139: name:
        !           140:          VARNAME       { y.f = 0; makevar($1, VARNAME, y); }
        !           141:        ;
        !           142: optop:
        !           143:          '+'           { $$ = '+'; }
        !           144:        | '-'           { $$ = '-'; }
        !           145:        | '*'           { $$ = '*'; }
        !           146:        | '/'           { $$ = '/'; }
        !           147:        | /* empty */   { $$ = ' '; }
        !           148:        ;
        !           149: 
        !           150: 
        !           151: leftbrace:
        !           152:          '{'                   { $$ = leftthing('{'); }
        !           153:        ;
        !           154: 
        !           155: prim:
        !           156:          BOX attrlist          { $$ = boxgen(); }
        !           157:        | CIRCLE attrlist       { $$ = circgen($1); }
        !           158:        | ELLIPSE attrlist      { $$ = circgen($1); }
        !           159:        | ARC attrlist          { $$ = arcgen($1); }
        !           160:        | LINE attrlist         { $$ = linegen($1); }
        !           161:        | ARROW attrlist        { $$ = linegen($1); }
        !           162:        | SPLINE attrlist       { $$ = linegen($1); }
        !           163:        | MOVE attrlist         { $$ = movegen(); }
        !           164:        | textlist attrlist     { $$ = textgen(); }
        !           165:        | TROFF                 { $$ = troffgen($1); }
        !           166:        | lbracket piclist ']' { $<o>$=rightthing($1,']'); } attrlist
        !           167:                                { $$ = blockgen($1, $<o>4); }
        !           168:        ;
        !           169: 
        !           170: lbracket:
        !           171:          '['                   { $$ = leftthing('['); }
        !           172:        ;
        !           173: 
        !           174: attrlist:
        !           175:          attrlist attr
        !           176:        | /* empty */
        !           177:        ;
        !           178: 
        !           179: attr:
        !           180:          ATTR expr             { makefattr($1, !DEFAULT, $2); }
        !           181:        | ATTR                  { makefattr($1, DEFAULT, 0.0); }
        !           182:        | expr                  { makefattr(curdir(), !DEFAULT, $1); }
        !           183:        | DIR expr              { makefattr($1, !DEFAULT, $2); }
        !           184:        | DIR                   { makefattr($1, DEFAULT, 0.0); }
        !           185:        | FROM position         { makeoattr($1, $2); }
        !           186:        | TO position           { makeoattr($1, $2); }
        !           187:        | AT position           { makeoattr($1, $2); }
        !           188:        | BY position           { makeoattr($1, $2); }
        !           189:        | WITH CORNER           { makeiattr(WITH, $2); }
        !           190:        | WITH '.' PLACENAME    { makeoattr(PLACE, getblock(getlast(1,BLOCK), $3)); }
        !           191:        | WITH '.' PLACENAME CORNER
        !           192:                { makeoattr(PLACE, getpos(getblock(getlast(1,BLOCK), $3), $4)); }
        !           193:        | WITH position         { makeoattr(PLACE, $2); }
        !           194:        | SAME                  { makeiattr(SAME, $1); }
        !           195:        | TEXTATTR              { maketattr($1, (char *) 0); }
        !           196:        | HEAD                  { makeiattr(HEAD, $1); }
        !           197:        | DOT expr              { makefattr(DOT, !DEFAULT, $2); }
        !           198:        | DOT                   { makefattr(DOT, DEFAULT, 0.0); }
        !           199:        | DASH expr             { makefattr(DASH, !DEFAULT, $2); }
        !           200:        | DASH                  { makefattr(DASH, DEFAULT, 0.0); }
        !           201:        | CHOP expr             { makefattr(CHOP, !DEFAULT, $2); }
        !           202:        | CHOP                  { makefattr(CHOP, DEFAULT, 0.0); }
        !           203:        | CHOP PLACENAME        { makeattr(CHOP, PLACENAME, getvar($2)); }
        !           204:        | FILL expr             { makefattr(FILL, !DEFAULT, $2); }
        !           205:        | FILL                  { makefattr(FILL, DEFAULT, 0.0); }
        !           206:        | NOEDGE                { makeiattr(NOEDGE, 0); }
        !           207:        | textlist
        !           208:        ;
        !           209: 
        !           210: textlist:
        !           211:          textattr
        !           212:        | textlist textattr
        !           213:        ;
        !           214: textattr:
        !           215:          text                  { maketattr(CENTER, $1); }
        !           216:        | text TEXTATTR         { maketattr($2, $1); }
        !           217:        | textattr TEXTATTR     { addtattr($2); }
        !           218:        ;
        !           219: text:
        !           220:          TEXT
        !           221:        | SPRINTF '(' text ')'                  { $$ = sprintgen($3); }
        !           222:        | SPRINTF '(' text ',' exprlist ')'     { $$ = sprintgen($3); }
        !           223:        ;
        !           224: 
        !           225: exprlist:
        !           226:          expr                  { exprsave($1); $$ = 0; }
        !           227:        | exprlist ',' expr     { exprsave($3); }
        !           228:        ;
        !           229: 
        !           230: position:              /* absolute, not relative */
        !           231:          place
        !           232:        | '(' position ')'                      { $$ = $2; }
        !           233:        | expr ',' expr                         { $$ = makepos($1, $3); }
        !           234:        | position '+' expr ',' expr            { $$ = fixpos($1, $3, $5); }
        !           235:        | position '-' expr ',' expr            { $$ = fixpos($1, -$3, -$5); }
        !           236:        | position '+' '(' expr ',' expr ')'    { $$ = fixpos($1, $4, $6); }
        !           237:        | position '-' '(' expr ',' expr ')'    { $$ = fixpos($1, -$4, -$6); }
        !           238:        | position '+' place                    { $$ = addpos($1, $3); }
        !           239:        | position '-' place                    { $$ = subpos($1, $3); }
        !           240:        | '(' place ',' place ')'       { $$ = makepos(getcomp($2,DOTX), getcomp($4,DOTY)); }
        !           241:        | expr LT position ',' position GT      { $$ = makebetween($1, $3, $5); }
        !           242:        | expr BETWEEN position AND position    { $$ = makebetween($1, $3, $5); }
        !           243:        ;
        !           244: 
        !           245: place:
        !           246:          PLACENAME             { y = getvar($1); $$ = y.o; }
        !           247:        | PLACENAME CORNER      { y = getvar($1); $$ = getpos(y.o, $2); }
        !           248:        | CORNER PLACENAME      { y = getvar($2); $$ = getpos(y.o, $1); }
        !           249:        | HERE                  { $$ = gethere(); }
        !           250:        | last type             { $$ = getlast($1, $2); }
        !           251:        | last type CORNER      { $$ = getpos(getlast($1, $2), $3); }
        !           252:        | CORNER last type      { $$ = getpos(getlast($2, $3), $1); }
        !           253:        | NTH type              { $$ = getfirst($1, $2); }
        !           254:        | NTH type CORNER       { $$ = getpos(getfirst($1, $2), $3); }
        !           255:        | CORNER NTH type       { $$ = getpos(getfirst($2, $3), $1); }
        !           256:        | blockname
        !           257:        | blockname CORNER      { $$ = getpos($1, $2); }
        !           258:        | CORNER blockname      { $$ = getpos($2, $1); }
        !           259:        ;
        !           260: 
        !           261: blockname:
        !           262:          last BLOCK '.' PLACENAME      { $$ = getblock(getlast($1,$2), $4); }
        !           263:        | NTH BLOCK '.' PLACENAME       { $$ = getblock(getfirst($1,$2), $4); }
        !           264:        | PLACENAME '.' PLACENAME       { y = getvar($1); $$ = getblock(y.o, $3); }
        !           265:        ;
        !           266: 
        !           267: last:
        !           268:          last LAST             { $$ = $1 + 1; }
        !           269:        | NTH LAST              { $$ = $1; }
        !           270:        | LAST                  { $$ = 1; }
        !           271:        ;
        !           272: 
        !           273: type:
        !           274:          BOX
        !           275:        | CIRCLE
        !           276:        | ELLIPSE
        !           277:        | ARC
        !           278:        | LINE
        !           279:        | ARROW
        !           280:        | SPLINE
        !           281:        | BLOCK
        !           282:        ;
        !           283: 
        !           284: expr:
        !           285:          NUMBER
        !           286:        | VARNAME               { $$ = getfval($1); }
        !           287:        | asgn
        !           288:        | expr '+' expr         { $$ = $1 + $3; }
        !           289:        | expr '-' expr         { $$ = $1 - $3; }
        !           290:        | expr '*' expr         { $$ = $1 * $3; }
        !           291:        | expr '/' expr         { if ($3 == 0.0) {
        !           292:                                        ERROR "division by 0" WARNING; $3 = 1; }
        !           293:                                  $$ = $1 / $3; }
        !           294:        | expr '%' expr         { if ((long)$3 == 0) {
        !           295:                                        ERROR "mod division by 0" WARNING; $3 = 1; }
        !           296:                                  $$ = (long)$1 % (long)$3; }
        !           297:        | '-' expr %prec UMINUS { $$ = -$2; }
        !           298:        | '(' expr ')'          { $$ = $2; }
        !           299:        | place DOTX            { $$ = getcomp($1, $2); }
        !           300:        | place DOTY            { $$ = getcomp($1, $2); }
        !           301:        | place DOTHT           { $$ = getcomp($1, $2); }
        !           302:        | place DOTWID          { $$ = getcomp($1, $2); }
        !           303:        | place DOTRAD          { $$ = getcomp($1, $2); }
        !           304:        | PLACENAME '.' VARNAME { y = getvar($1); $$ = getblkvar(y.o, $3); }
        !           305:        | last BLOCK '.' VARNAME { $$ = getblkvar(getlast($1,$2), $4); }
        !           306:        | NTH BLOCK '.' VARNAME { $$ = getblkvar(getfirst($1,$2), $4); }
        !           307:        | expr GT expr          { $$ = $1 > $3; }
        !           308:        | expr LT expr          { $$ = $1 < $3; }
        !           309:        | expr LE expr          { $$ = $1 <= $3; }
        !           310:        | expr GE expr          { $$ = $1 >= $3; }
        !           311:        | expr EQ expr          { $$ = $1 == $3; }
        !           312:        | expr NEQ expr         { $$ = $1 != $3; }
        !           313:        | expr ANDAND expr      { $$ = $1 && $3; }
        !           314:        | expr OROR expr        { $$ = $1 || $3; }
        !           315:        | NOT expr              { $$ = !($2); }
        !           316:        | LOG '(' expr ')'              { $$ = Log10($3); }
        !           317:        | EXP '(' expr ')'              { $$ = Exp($3 * log(10.0)); }
        !           318:        | expr '^' expr                 { $$ = pow($1, $3); }
        !           319:        | SIN '(' expr ')'              { $$ = sin($3); }
        !           320:        | COS '(' expr ')'              { $$ = cos($3); }
        !           321:        | ATAN2 '(' expr ',' expr ')'   { $$ = atan2($3, $5); }
        !           322:        | SQRT '(' expr ')'             { $$ = Sqrt($3); }
        !           323:        | RAND '(' ')'                  { $$ = (float)rand() / 32767.0; /* might be 2^31-1 */ }
        !           324:        | MAX '(' expr ',' expr ')'     { $$ = $3 >= $5 ? $3 : $5; }
        !           325:        | MIN '(' expr ',' expr ')'     { $$ = $3 <= $5 ? $3 : $5; }
        !           326:        | INT '(' expr ')'              { $$ = (long) $3; }
        !           327:        ;

unix.superglobalmegacorp.com

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