|
|
1.1 ! root 1: %{ ! 2: #include "ideal.h" ! 3: ! 4: extern BOXPTR boxlist; ! 5: ! 6: yyerror (message) ! 7: char *message; ! 8: { ! 9: fprintf (stderr, "ideal: "); ! 10: fprintf (stderr, "%s ", message); ! 11: fprintf (stderr, "near line %d in file %s\n", ! 12: lineno, ! 13: filename ! 14: ); ! 15: } ! 16: %} ! 17: %token BOX VAR BDLIST PUT CONN TO USING ! 18: %token CONSTRUCT DRAW OPAQUE LEFT CENTER RIGHT AT ! 19: %token NAME CONST STRING ! 20: %token LINE CIRCLE ARC SPLINE ! 21: %token PATH ! 22: %token INTERIOR EXTERIOR ! 23: %token LBRACE RBRACE ! 24: %token ELEWISE ! 25: ! 26: %left '^' ! 27: %left '+' '-' ! 28: %left '*' '/' ELEWISE ! 29: %left '[' ! 30: %left UMINUS ! 31: ! 32: %% ! 33: stuff :figspec ! 34: | /*empty*/ ! 35: ; ! 36: ! 37: figspec :boxdef { ! 38: forget (((BOXPTR)$1)->name); ! 39: ((BOXPTR) $1)->next = boxlist; ! 40: boxlist = (BOXPTR) $1; ! 41: } ! 42: |figspec boxdef { ! 43: forget (((BOXPTR)$2)->name); ! 44: ((BOXPTR)$2)->next = boxlist; ! 45: boxlist = (BOXPTR) $2; ! 46: } ! 47: ; ! 48: ! 49: boxdef :body {$$ = $1;} ! 50: |BOX body {$$ = $2;} ! 51: ; ! 52: ! 53: body :NAME LBRACE stmts RBRACE {$$ = (int) boxgen ($1, (STMTPTR) $3);} ! 54: |NAME LBRACE RBRACE {$$ = (int) boxgen ($1, (STMTPTR) NULL);} ! 55: ; ! 56: ! 57: stmts :stmt {$$ = $1;} ! 58: |stmts stmt { ! 59: if ($2) { ! 60: ((STMTPTR)$2)->next = (STMTPTR)$1; ! 61: $$ = $2; ! 62: } else ! 63: $$ = $1; ! 64: } ! 65: ; ! 66: ! 67: stmt :varstmt ';' {$$ = (int) stmtgen (VAR, (char *) $1);} ! 68: |eqnstmt ';' {$$ = (int) stmtgen ('=', (char *) $1);} ! 69: |bdlist ';' {$$ = (int) stmtgen (BDLIST, (char *) $1);} ! 70: |putstmt {$$ = (int) stmtgen (PUT, (char *) $1);} ! 71: |connstmt ';' {$$ = (int) stmtgen (CONN, (char *) $1);} ! 72: |penstmt ';' {if ($1) { ! 73: $$ = (int) stmtgen (USING, (char *) $1); ! 74: } else { ! 75: $$ = (int) NULL; ! 76: } ! 77: } ! 78: |drawstmt ';' {$$ = (int) stmtgen (DRAW, (char *) $1);} ! 79: |opaque ';' {$$ = (int) stmtgen (OPAQUE, (char *) $1);} ! 80: |strstmt ';' {$$ = (int) stmtgen (STRING, (char *) $1);} ! 81: |splstmt ';' {$$ = (int) stmtgen (SPLINE, (char *) $1);} ! 82: |';' {$$ = (int) NULL;} ! 83: |error ';' {fprintf (stderr, "ideal: syntax error near line %d in file %s\n", ! 84: lineno, filename); ! 85: yyerrok; ! 86: $$ = NULL; ! 87: } ! 88: ; ! 89: ! 90: varstmt :VAR varlist {$$ = (int) $2;} ! 91: ; ! 92: ! 93: varlist :NAME {$$ = (int) namegen ($1);} ! 94: |varlist ',' NAME { ! 95: NAMEPTR temp; ! 96: temp = (NAMEPTR) namegen ($3); ! 97: temp->next = (NAMEPTR)$1; ! 98: $$ = (int) temp; ! 99: } ! 100: ; ! 101: ! 102: eqnstmt :expr '=' expr {$$ = (int) intlgen ('=', (EXPR) $1, (EXPR) $3);} ! 103: |expr '~' expr {$$ = (int) intlgen ('~', (EXPR) $1, (EXPR) $3);} ! 104: |eqnstmt '=' expr {$$ = (int) intlgen ('=', (EXPR) $1, (EXPR) $3);} ! 105: |eqnstmt '~' expr {$$ = (int) intlgen ('~', (EXPR) $1, (EXPR) $3);} ! 106: ; ! 107: ! 108: bdlist :BDLIST '=' exprlist {$$ = (int) $3;} ! 109: ; ! 110: ! 111: exprlist:expr {$$ = (int) exprgen ((EXPR) $1);} ! 112: |exprlist ',' expr { ! 113: EXPRPTR temp; ! 114: temp = (EXPRPTR) exprgen ((EXPR) $3); ! 115: temp->next = (EXPRPTR)$1; ! 116: $$ = (int) temp; ! 117: } ! 118: ; ! 119: ! 120: putstmt :putword NAME ':' body {$$ = (int) putgen ($2, (BOXPTR) $4, $1);} ! 121: |putword body {$$ = (int) putgen (NULL, (BOXPTR) $2, $1);} ! 122: |NAME ':' putword body {$$ = (int) putgen ($1, (BOXPTR) $4, $3);} ! 123: ; ! 124: ! 125: putword :PUT {$$ = $1;} ! 126: |CONSTRUCT {$$ = $1;} ! 127: ; ! 128: ! 129: connstmt:CONN knotlist {$$ = (int) $2;} ! 130: ; ! 131: ! 132: penstmt :CONN knotlist USING expr body '<' expr ',' expr '>' ! 133: {if (!((EXPRPTR) $2)->next || ((EXPRPTR) $2)->next->next) { ! 134: fprintf (stderr, "ideal: improper pen statement\n >>>pen ignored\n"); ! 135: $$ = (int) NULL; ! 136: } else { ! 137: $$ = (int) pengen ( ! 138: ((EXPRPTR) $2)->next->expr, ! 139: ((EXPRPTR) $2)->expr, ! 140: (EXPR) $4, ! 141: (EXPR) $7, ! 142: (EXPR) $9, ! 143: (BOXPTR) $5 ! 144: ); ! 145: tryfree(((EXPRPTR) $2)->next); ! 146: tryfree((EXPRPTR) $2); ! 147: } ! 148: } ! 149: ; ! 150: ! 151: drawstmt:DRAW NAME {$$ = (int) miscgen ($2);} ! 152: ; ! 153: ! 154: opaque :OPAQUE {$$ = (int) miscgen (INTERIOR);} ! 155: |OPAQUE INTERIOR {$$ = (int) miscgen (INTERIOR);} ! 156: |OPAQUE EXTERIOR {$$ = (int) miscgen (EXTERIOR);} ! 157: ; ! 158: ! 159: strstmt :LEFT STRING AT expr {$$ = (int) strgen (LEFT, (char *) $2, (EXPR) $4);} ! 160: |CENTER STRING AT expr {$$ = (int) strgen (CENTER, (char *) $2, (EXPR) $4);} ! 161: |STRING AT expr {$$ = (int) strgen (CENTER, (char *) $1, (EXPR) $3);} ! 162: |RIGHT STRING AT expr {$$ = (int) strgen (RIGHT, (char *) $2, (EXPR) $4);} ! 163: ; ! 164: ! 165: splstmt :SPLINE knotlist {$$ = (int) $2;} ! 166: ! 167: knotlist:expr {$$ = (int) exprgen ((EXPR) $1);} ! 168: |knotlist TO expr { ! 169: EXPRPTR temp; ! 170: temp = (EXPRPTR) exprgen ((EXPR) $3); ! 171: temp->next = (EXPRPTR) $1; ! 172: $$ = (int) temp; ! 173: } ! 174: ; ! 175: ! 176: expr :'-' expr %prec UMINUS ! 177: {$$ = (int) intlgen ('-', (EXPR) NULL, (EXPR) $2);} ! 178: |expr '+' expr {$$ = (int) intlgen ('+', (EXPR) $1, (EXPR) $3);} ! 179: |expr '-' expr {$$ = (int) intlgen ('-', (EXPR) $1, (EXPR) $3);} ! 180: |expr '*' expr {$$ = (int) intlgen ('*', (EXPR) $1, (EXPR) $3);} ! 181: |expr '/' expr {$$ = (int) intlgen ('/', (EXPR) $1, (EXPR) $3);} ! 182: |expr '*' ',' expr %prec ELEWISE ! 183: {$$ = (int) intlgen (ELEWISE, (EXPR) $1, (EXPR) $4);} ! 184: |'^' expr {$$ = (int) intlgen ('^', (EXPR) NULL, (EXPR) $2);} ! 185: |pathname {$$ = (int) extlgen ((NAMEPTR) $1);} ! 186: |CONST {$$ = $1;} ! 187: |'(' expr ')' {$$ = $2;} ! 188: |'(' expr ',' expr ')' {$$ = (int) intlgen (',', (EXPR) $2, (EXPR) $4);} ! 189: |NAME '(' exprlist ')' {$$ = (int) intlgen (NAME, (EXPR) $1, (EXPR) $3);} ! 190: |expr '[' expr ',' expr ']' { ! 191: $$ = (int) bracket ( ! 192: (EXPR) $1, ! 193: (EXPR) $3, ! 194: (EXPR) $5 ! 195: ); ! 196: } ! 197: ; ! 198: ! 199: pathname:NAME {$$ = (int) namegen ($1);} ! 200: |NAME '.' pathname { ! 201: NAMEPTR temp; ! 202: temp = (NAMEPTR) namegen($1); ! 203: temp->next = (NAMEPTR)$3; ! 204: $$ = (int) temp; ! 205: } ! 206: ;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.