Annotation of researchv10no/cmd/grap/grap.y, revision 1.1.1.1

1.1       root        1: %{
                      2: #include <stdio.h>
                      3: #include <math.h>
                      4: #include <stdlib.h>
                      5: #include <string.h>
                      6: #include "grap.h"
                      7: 
                      8: #define        RAND_MAX 32767  /* if your rand() returns bigger, change this too */
                      9: 
                     10: extern int yylex(void);
                     11: extern int yyparse(void);
                     12: 
                     13: %}
                     14: 
                     15: %token <i>     FRAME TICKS GRID LABEL COORD
                     16: %token <i>     LINE ARROW CIRCLE DRAW NEW PLOT NEXT
                     17: %token <p>     PIC
                     18: %token <i>     COPY THRU UNTIL
                     19: %token <i>     FOR FROM TO BY AT WITH
                     20: %token <i>     IF
                     21: %token <p>     GRAPH THEN ELSE DOSTR
                     22: %token <i>     DOT DASH INVIS SOLID
                     23: %token <i>     TEXT JUST SIZE
                     24: %token <i>     LOG EXP SIN COS ATAN2 SQRT RAND MAX MIN INT PRINT SPRINTF
                     25: %token <i>     X Y SIDE IN OUT OFF UP DOWN ACROSS
                     26: %token <i>     HEIGHT WIDTH RADIUS
                     27: %token <f>     NUMBER
                     28: %token <op>    NAME VARNAME DEFNAME
                     29: %token <p>     STRING
                     30: %token <i>     ST '(' ')' ','
                     31: 
                     32: %right <f>     '='
                     33: %left  <f>     OR
                     34: %left  <f>     AND
                     35: %nonassoc <f>  GT LT LE GE EQ NE
                     36: %left  <f>     '+' '-'
                     37: %left  <f>     '*' '/' '%'
                     38: %right <f>     UMINUS NOT
                     39: %right <f>     '^'
                     40: 
                     41: %type  <f>     expr optexpr if_expr number assign
                     42: %type  <i>     optop
                     43: %type  <p>     optstring if
                     44: %type  <op>    optname iterator name
                     45: %type  <pt>    point
                     46: %type  <i>     side optside numlist comma linetype drawtype
                     47: %type  <ap>    linedesc optdesc stringlist string stringattr sattrlist exprlist
                     48: %type  <i>     frameitem framelist coordlog
                     49: %type  <f>     string_expr
                     50: 
                     51: %%
                     52: 
                     53: top:
                     54:          graphseq              { if (codegen && !synerr) graph((char *) 0); }
                     55:        | /* empty */           { codegen = 0; }
                     56:        | error                 { codegen = 0; ERROR "syntax error" WARNING; }
                     57:        ;
                     58: 
                     59: graphseq:
                     60:          statlist
                     61:        | graph statlist
                     62:        | graphseq graph statlist
                     63:        ;
                     64: graph:
                     65:          GRAPH                 { graph($1); endstat(); }
                     66:        ;
                     67: 
                     68: statlist:
                     69:          ST
                     70:        | stat ST               { endstat(); }
                     71:        | statlist stat ST      { endstat(); }
                     72:        ;
                     73: 
                     74: stat:
                     75:          FRAME framelist       { codegen = 1; }
                     76:        | ticks                 { codegen = 1; }
                     77:        | grid                  { codegen = 1; }
                     78:        | label                 { codegen = 1; }
                     79:        | coord
                     80:        | plot                  { codegen = 1; }
                     81:        | line                  { codegen = 1; }
                     82:        | circle                { codegen = 1; }
                     83:        | draw
                     84:        | next                  { codegen = 1; }
                     85:        | PIC                   { codegen = 1; pic($1); }
                     86:        | for
                     87:        | if
                     88:        | copy
                     89:        | numlist               { codegen = 1; numlist(); }
                     90:        | assign
                     91:        | PRINT expr            { fprintf(stderr, "\t%g\n", $2); }
                     92:        | PRINT string          { fprintf(stderr, "\t%s\n", $2->sval); freeattr($2); }
                     93:        | /* empty */
                     94:        ;
                     95: 
                     96: numlist:
                     97:          number                { savenum(0, $1); $$ = 1; }
                     98:        | numlist number        { savenum($1, $2); $$ = $1+1; }
                     99:        | numlist comma number  { savenum($1, $3); $$ = $1+1; }
                    100:        ;
                    101: number:
                    102:          NUMBER
                    103:        | '-' NUMBER %prec UMINUS       { $$ = -$2; }
                    104:        | '+' NUMBER %prec UMINUS       { $$ = $2; }
                    105:        ;
                    106: 
                    107: label:
                    108:          LABEL optside stringlist lablist      { label($2, $3); }
                    109:        ;
                    110: lablist:
                    111:          labattr
                    112:        | lablist labattr
                    113:        | /* empty */
                    114:        ;
                    115: labattr:
                    116:          UP expr               { labelmove($1, $2); }
                    117:        | DOWN expr             { labelmove($1, $2); }
                    118:        | SIDE expr             { labelmove($1, $2); /* LEFT or RIGHT only */ }
                    119:        | WIDTH expr            { labelwid($2); }
                    120:        ;
                    121: 
                    122: framelist:
                    123:          framelist frameitem
                    124:        | /* empty */           { $$ = 0; }
                    125:        ;
                    126: frameitem:
                    127:          HEIGHT expr           { frameht($2); }
                    128:        | WIDTH expr            { framewid($2); }
                    129:        | side linedesc         { frameside($1, $2); }
                    130:        | linedesc              { frameside(0, $1); }
                    131:        ;
                    132: side:
                    133:          SIDE
                    134:        ;
                    135: optside:
                    136:          side
                    137:        | /* empty */           { $$ = 0; }
                    138:        ;
                    139: 
                    140: linedesc:
                    141:          linetype optexpr      { $$ = makeattr($1, $2, (char *) 0, 0, 0); }
                    142:        ;
                    143: linetype:
                    144:          DOT | DASH | SOLID | INVIS
                    145:        ;
                    146: optdesc:
                    147:          linedesc
                    148:        | /* empty */           { $$ = makeattr(0, 0.0, (char *) 0, 0, 0); }
                    149:        ;
                    150: 
                    151: ticks:
                    152:          TICKS tickdesc        { ticks(); }
                    153:        ;
                    154: tickdesc:
                    155:          tickattr
                    156:        | tickdesc tickattr
                    157:        ;
                    158: tickattr:
                    159:          side                  { tickside($1); }
                    160:        | IN expr               { tickdir(IN, $2, 1); }
                    161:        | OUT expr              { tickdir(OUT, $2, 1); }
                    162:        | IN                    { tickdir(IN, 0.0, 0); }
                    163:        | OUT                   { tickdir(OUT, 0.0, 0); }
                    164:        | AT optname ticklist   { setlist(); ticklist($2, AT); }
                    165:        | iterator              { setlist(); ticklist($1, AT); }
                    166:        | side OFF              { tickoff($1); }
                    167:        | OFF                   { tickoff(LEFT|RIGHT|TOP|BOT); }
                    168:        | labattr
                    169:        ;
                    170: ticklist:
                    171:          tickpoint
                    172:        | ticklist comma tickpoint
                    173:        ;
                    174: tickpoint:
                    175:          expr                  { savetick($1, (char *) 0); }
                    176:        | expr string           { savetick($1, $2->sval); }
                    177:        ;
                    178: iterator:
                    179:          FROM optname expr TO optname expr BY optop expr optstring
                    180:                        { iterator($3, $6, $8, $9, $10); $$ = $2; }
                    181:        | FROM optname expr TO optname expr optstring
                    182:                        { iterator($3, $6, '+', 1.0, $7); $$ = $2; }
                    183:        ;
                    184: optop:
                    185:          '+'           { $$ = '+'; }
                    186:        | '-'           { $$ = '-'; }
                    187:        | '*'           { $$ = '*'; }
                    188:        | '/'           { $$ = '/'; }
                    189:        | /* empty */   { $$ = ' '; }
                    190:        ;
                    191: optstring:
                    192:          string        { $$ = $1->sval; }
                    193:        | /* empty */   { $$ = (char *) 0; }
                    194:        ;
                    195: 
                    196: grid:
                    197:          GRID griddesc         { ticks(); }
                    198:        ;
                    199: griddesc:
                    200:          gridattr
                    201:        | griddesc gridattr
                    202:        ;
                    203: gridattr:
                    204:          side                  { tickside($1); }
                    205:        | X                     { tickside(BOT); }
                    206:        | Y                     { tickside(LEFT); }
                    207:        | linedesc              { griddesc($1); }
                    208:        | AT optname ticklist   { setlist(); gridlist($2); }
                    209:        | iterator              { setlist(); gridlist($1); }
                    210:        | TICKS OFF             { gridtickoff(); }
                    211:        | OFF                   { gridtickoff(); }
                    212:        | labattr
                    213:        ;
                    214: 
                    215: line:
                    216:          LINE FROM point TO point optdesc      { line($1, $3, $5, $6); }
                    217:        | LINE optdesc FROM point TO point      { line($1, $4, $6, $2); }
                    218:        ;
                    219: circle:
                    220:          CIRCLE RADIUS expr AT point           { circle($3, $5); }
                    221:        | CIRCLE AT point RADIUS expr           { circle($5, $3); }
                    222:        | CIRCLE AT point                       { circle(0.0, $3); }
                    223:        ;
                    224: 
                    225: stringlist:
                    226:          string
                    227:        | stringlist string     { $$ = addattr($1, $2); }
                    228:        ;
                    229: string:
                    230:          STRING sattrlist      { $$ = makesattr($1); }
                    231:        | SPRINTF '(' STRING ')' sattrlist
                    232:                                { $$ = makesattr(sprntf($3, (Attr*) 0)); }
                    233:        | SPRINTF '(' STRING ',' exprlist ')' sattrlist
                    234:                                { $$ = makesattr(sprntf($3, $5)); }
                    235:        ;
                    236: exprlist:
                    237:          expr                  { $$ = makefattr(NUMBER, $1); }
                    238:        | exprlist ',' expr     { $$ = addattr($1, makefattr(NUMBER, $3)); }
                    239:        ;
                    240: sattrlist:
                    241:          stringattr
                    242:        | sattrlist stringattr
                    243:        | /* empty */           { $$ = (Attr *) 0; }
                    244:        ;
                    245: stringattr:
                    246:          JUST                  { setjust($1); }
                    247:        | SIZE optop expr       { setsize($2, $3); }
                    248:        ;
                    249: 
                    250: coord:
                    251:          COORD optname coordlist       { coord($2); }
                    252:        | COORD optname                 { resetcoord($2); }
                    253:        ;
                    254: coordlist:
                    255:          coorditem
                    256:        | coordlist coorditem
                    257:        ;
                    258: coorditem:
                    259:          coordlog      { coordlog($1); }
                    260:        | X point       { coord_x($2); }
                    261:        | Y point       { coord_y($2); }
                    262:        | X optname expr TO expr                { coord_x(makepoint($2, $3, $5)); }
                    263:        | Y optname expr TO expr                { coord_y(makepoint($2, $3, $5)); }
                    264:        | X FROM optname expr TO expr           { coord_x(makepoint($3, $4, $6)); }
                    265:        | Y FROM optname expr TO expr           { coord_y(makepoint($3, $4, $6)); }
                    266:        ;
                    267: coordlog:
                    268:          LOG X         { $$ = XFLAG; }
                    269:        | LOG Y         { $$ = YFLAG; }
                    270:        | LOG X LOG Y   { $$ = XFLAG|YFLAG; }
                    271:        | LOG Y LOG X   { $$ = XFLAG|YFLAG; }
                    272:        | LOG LOG       { $$ = XFLAG|YFLAG; }
                    273:        ;
                    274: 
                    275: plot:
                    276:          stringlist AT point           { plot($1, $3); }
                    277:        | PLOT stringlist AT point      { plot($2, $4); }
                    278:        | PLOT expr optstring AT point  { plotnum($2, $3, $5); }
                    279:        ;
                    280: 
                    281: draw:
                    282:          drawtype optname linedesc             { drawdesc($1, $2, $3, (char *) 0); }
                    283:        | drawtype optname optdesc string       { drawdesc($1, $2, $3, $4->sval); }
                    284:        | drawtype optname string optdesc       { drawdesc($1, $2, $4, $3->sval); }
                    285:        ;
                    286: drawtype:
                    287:          DRAW
                    288:        | NEW
                    289:        ;
                    290: 
                    291: next:
                    292:          NEXT optname AT point optdesc         { next($2, $4, $5); }
                    293: 
                    294: copy:
                    295:          COPY copylist         { copy(); }
                    296:        ;
                    297: copylist:
                    298:          copyattr
                    299:        | copylist copyattr
                    300:        ;
                    301: copyattr:
                    302:          string                { copyfile($1->sval); }
                    303:        | THRU DEFNAME          { copydef($2); }
                    304:        | UNTIL string          { copyuntil($2->sval); }
                    305:        ;
                    306: 
                    307: for:
                    308:          FOR name FROM expr TO expr BY optop expr DOSTR
                    309:                { forloop($2, $4, $6, $8, $9, $10); }
                    310:        | FOR name FROM expr TO expr DOSTR
                    311:                { forloop($2, $4, $6, '+', 1.0, $7); }
                    312:        | FOR name '=' expr TO expr BY optop expr DOSTR
                    313:                { forloop($2, $4, $6, $8, $9, $10); }
                    314:        | FOR name '=' expr TO expr DOSTR
                    315:                { forloop($2, $4, $6, '+', 1.0, $7); }
                    316:        ;
                    317: 
                    318: if:
                    319:          IF if_expr THEN ELSE          { $$ = ifstat($2, $3, $4); }
                    320:        | IF if_expr THEN               { $$ = ifstat($2, $3, (char *) 0); }
                    321:        ;
                    322: if_expr:
                    323:          expr
                    324:        | string_expr
                    325:        | if_expr AND string_expr       { $$ = $1 && $3; }
                    326:        | if_expr OR string_expr        { $$ = $1 || $3; }
                    327:        ;
                    328: string_expr:
                    329:          STRING EQ STRING      { $$ = strcmp($1,$3) == 0; free($1); free($3); }
                    330:        | STRING NE STRING      { $$ = strcmp($1,$3) != 0; free($1); free($3); }
                    331:        ;
                    332: 
                    333: point:
                    334:          optname expr comma expr               { $$ = makepoint($1, $2, $4); }
                    335:        | optname '(' expr comma expr ')'       { $$ = makepoint($1, $3, $5); }
                    336:        ;
                    337: comma:
                    338:          ','           { $$ = ','; }
                    339:        ;
                    340: 
                    341: optname:
                    342:          NAME          { $$ = $1; }
                    343:        | /* empty */   { $$ = lookup(curr_coord, 1); }
                    344:        ;
                    345: 
                    346: expr:
                    347:          NUMBER
                    348:        | assign
                    349:        | '(' string_expr ')'   { $$ = $2; }
                    350:        | VARNAME               { $$ = getvar($1); }
                    351:        | expr '+' expr         { $$ = $1 + $3; }
                    352:        | expr '-' expr         { $$ = $1 - $3; }
                    353:        | expr '*' expr         { $$ = $1 * $3; }
                    354:        | expr '/' expr         { if ($3 == 0.0) {
                    355:                                        ERROR "division by 0" WARNING; $3 = 1; }
                    356:                                  $$ = $1 / $3; }
                    357:        | expr '%' expr         { if ((long)$3 == 0) {
                    358:                                        ERROR "mod division by 0" WARNING; $3 = 1; }
                    359:                                  $$ = (long)$1 % (long)$3; }
                    360:        | '-' expr %prec UMINUS { $$ = -$2; }
                    361:        | '+' expr %prec UMINUS { $$ = $2; }
                    362:        | '(' expr ')'          { $$ = $2; }
                    363:        | LOG '(' expr ')'              { $$ = Log10($3); }
                    364:        | EXP '(' expr ')'              { $$ = Exp($3 * log(10.0)); }
                    365:        | expr '^' expr                 { $$ = pow($1, $3); }
                    366:        | SIN '(' expr ')'              { $$ = sin($3); }
                    367:        | COS '(' expr ')'              { $$ = cos($3); }
                    368:        | ATAN2 '(' expr ',' expr ')'   { $$ = atan2($3, $5); }
                    369:        | SQRT '(' expr ')'             { $$ = Sqrt($3); }
                    370:        | RAND '(' ')'                  { $$ = (double)rand() / (double)RAND_MAX; }
                    371:        | MAX '(' expr ',' expr ')'     { $$ = $3 >= $5 ? $3 : $5; }
                    372:        | MIN '(' expr ',' expr ')'     { $$ = $3 <= $5 ? $3 : $5; }
                    373:        | INT '(' expr ')'      { $$ = (long) $3; }
                    374:        | expr GT expr          { $$ = $1 > $3; }
                    375:        | expr LT expr          { $$ = $1 < $3; }
                    376:        | expr LE expr          { $$ = $1 <= $3; }
                    377:        | expr GE expr          { $$ = $1 >= $3; }
                    378:        | expr EQ expr          { $$ = $1 == $3; }
                    379:        | expr NE expr          { $$ = $1 != $3; }
                    380:        | expr AND expr         { $$ = $1 && $3; }
                    381:        | expr OR expr          { $$ = $1 || $3; }
                    382:        | NOT expr              { $$ = !($2); }
                    383:        ;
                    384: assign:
                    385:          name '=' expr         { $$ = setvar($1, $3); }
                    386:        ;
                    387: 
                    388: name:
                    389:          NAME
                    390:        | VARNAME
                    391:        ;
                    392: 
                    393: optexpr:
                    394:          expr
                    395:        | /* empty */           { $$ = 0.0; }
                    396:        ;

unix.superglobalmegacorp.com

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