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

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

unix.superglobalmegacorp.com

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