1 /* picy.y (Berkeley) 1.2 83/12/29 */ 2 %{ 3 #include <stdio.h> 4 #include "pic.h" 5 YYSTYPE y; 6 %} 7 8 %token <i> BOX 1 9 %token <i> ARROW 2 10 %token <i> CIRCLE 3 11 %token <i> ARC 4 12 %token <i> ELLIPSE 5 13 %token <i> LINE 6 14 %token <i> MOVE 7 15 %token <i> TEXT 8 16 %token <i> TROFF 9 17 %token <i> SPLINE 10 18 %token <i> BLOCK 11 19 %token <i> BLOCKEND 12 20 %token <i> PRINT 21 %token <i> PLACE 22 %token <i> ATTR 23 %token <i> SPREAD FILL LJUST RJUST ABOVE BELOW 24 %token <i> LEFT RIGHT UP DOWN FROM TO AT BY WITH HEAD CW CCW THEN 25 %token <i> HEIGHT WIDTH RADIUS DIAMETER LENGTH SIZE 26 %token <i> PLACENAME VARNAME DEFNAME CORNER HERE LAST NTH SAME BETWEEN AND 27 %token <i> EAST WEST NORTH SOUTH NE NW SE SW CENTER START END 28 %token <i> DOTX DOTY DOTHT DOTWID DOTRAD 29 %token <f> NUMBER 30 %token <i> DIR 31 %token <i> DOT DASH CHOP 32 %token <o> ST /* statement terminator */ 33 34 %left <f> '+' '-' 35 %left <f> '*' '/' '%' 36 %right <f> UMINUS 37 38 %type <f> expr opt_expr 39 %type <o> leftbrace picture piclist position lbracket 40 %type <o> prim place blockname 41 %type <i> textattr last type 42 43 44 %% 45 46 top: 47 piclist 48 | /* empty */ 49 | error { yyerror("syntax error"); } 50 ; 51 52 piclist: 53 picture 54 | piclist picture 55 ; 56 57 picture: 58 prim ST { codegen = 1; } 59 | leftbrace piclist '}' { rightthing($1, '}'); $$ = $2; } 60 | PLACENAME ':' picture { makevar($1, PLACENAME, $3); $$ = $3; } 61 | PLACENAME ':' ST picture { makevar($1, PLACENAME, $4); $$ = $4; } 62 | PLACENAME ':' position ST { makevar($1, PLACENAME, $3); $$ = $3; } 63 | VARNAME '=' expr ST { makevar($1, VARNAME, $<i>3); checkscale($1); } 64 | DIR { setdir($1); } 65 | PRINT expr ST { printexpr($2); } 66 | PRINT position ST { printpos($2); } 67 | ST 68 ; 69 70 leftbrace: 71 '{' { $$ = leftthing('{'); } 72 ; 73 74 prim: 75 BOX attrlist { $$ = boxgen($1); } 76 | CIRCLE attrlist { $$ = circgen($1); } 77 | ELLIPSE attrlist { $$ = circgen($1); } 78 | ARC attrlist { $$ = arcgen($1); } 79 | LINE attrlist { $$ = linegen($1); } 80 | ARROW attrlist { $$ = linegen($1); } 81 | SPLINE attrlist { $$ = splinegen($1); } 82 | MOVE attrlist { $$ = movegen($1); } 83 | TEXT attrlist { $$ = textgen($1); } 84 | TROFF { $$ = troffgen($1); } 85 | lbracket piclist ']' { $<o>$=rightthing($1,']'); } attrlist 86 { $$ = blockgen($1, $2, $<o>4); } 87 ; 88 89 lbracket: 90 '[' { $$ = leftthing('['); } 91 ; 92 93 attrlist: 94 attrlist attr 95 | /* empty */ { makeattr(0, 0); } 96 ; 97 98 attr: 99 ATTR opt_expr { makeattr($1, $<i>2); } 100 | DIR opt_expr { makeattr($1, $<i>2); } 101 | FROM position { makeattr($1, $2); } 102 | TO position { makeattr($1, $2); } 103 | AT position { makeattr($1, $2); } 104 | BY position { makeattr($1, $2); } 105 | WITH CORNER { makeattr(WITH, $2); } 106 | WITH '.' PLACENAME { makeattr(PLACE, getblock(getlast(1,BLOCK), $3)); } 107 | WITH position { makeattr(PLACE, $2); } 108 | SAME { makeattr(SAME, $1); } 109 | textattr { makeattr($1, 0); } 110 | HEAD { makeattr(HEAD, $1); } 111 | DOT opt_expr { makeattr(DOT, $<i>2); } 112 | DASH opt_expr { makeattr(DASH, $<i>2); } 113 | CHOP opt_expr { makeattr(CHOP, $<i>2); } 114 | textlist 115 ; 116 117 opt_expr: 118 expr 119 | /* empty */ { $$ = 0; } 120 ; 121 122 textlist: 123 TEXT { makeattr(CENTER, $1); } 124 | TEXT textattr { makeattr($2, $1); } 125 | textlist TEXT { makeattr(CENTER, $2); } 126 | textlist TEXT textattr { makeattr($3, $2); } 127 ; 128 129 textattr: 130 LJUST 131 | RJUST 132 | SPREAD 133 | FILL 134 | CENTER 135 | ABOVE 136 | BELOW 137 ; 138 139 position: /* absolute, not relative */ 140 place 141 | expr ',' expr { $$ = makepos($1, $3); } 142 | position '+' expr ',' expr { $$ = fixpos($1, $3, $5); } 143 | position '-' expr ',' expr { $$ = fixpos($1, -$3, -$5); } 144 | '(' expr ',' expr ')' { $$ = makepos($2, $4); } 145 | position '+' '(' expr ',' expr ')' { $$ = fixpos($1, $4, $6); } 146 | position '-' '(' expr ',' expr ')' { $$ = fixpos($1, -$4, -$6); } 147 | '(' place ',' place ')' { $$ = makepos(getcomp($2,DOTX), getcomp($4,DOTY)); } 148 | expr '<' position ',' position '>' { $$ = makebetween($1, $3, $5); } 149 | expr BETWEEN position AND position { $$ = makebetween($1, $3, $5); } 150 ; 151 152 place: 153 PLACENAME { y = getvar($1); $$ = y.o; } 154 | PLACENAME CORNER { y = getvar($1); $$ = getpos(y.o, $2); } 155 | CORNER PLACENAME { y = getvar($2); $$ = getpos(y.o, $1); } 156 | HERE { $$ = gethere($1); } 157 | last type { $$ = getlast($1, $2); } 158 | last type CORNER { $$ = getpos(getlast($1, $2), $3); } 159 | CORNER last type { $$ = getpos(getlast($2, $3), $1); } 160 | NTH type { $$ = getfirst($1, $2); } 161 | NTH type CORNER { $$ = getpos(getfirst($1, $2), $3); } 162 | CORNER NTH type { $$ = getpos(getfirst($2, $3), $1); } 163 | blockname 164 | blockname CORNER { $$ = getpos($1, $2); } 165 | CORNER blockname { $$ = getpos($2, $1); } 166 ; 167 168 blockname: 169 last BLOCK '.' PLACENAME { $$ = getblock(getlast($1,$2), $4); } 170 | NTH BLOCK '.' PLACENAME { $$ = getblock(getfirst($1,$2), $4); } 171 | PLACENAME '.' PLACENAME { y = getvar($1); $$ = getblock(y.o, $3); } 172 ; 173 174 last: 175 last LAST { $$ = $1 + 1; } 176 | NTH LAST { $$ = $1; } 177 | LAST { $$ = 1; } 178 ; 179 180 type: 181 BOX 182 | CIRCLE 183 | ELLIPSE 184 | ARC 185 | LINE 186 | ARROW 187 | SPLINE 188 | BLOCK 189 ; 190 191 expr: 192 expr '+' expr { $$ = $1 + $3; } 193 | expr '-' expr { $$ = $1 - $3; } 194 | expr '*' expr { $$ = $1 * $3; } 195 | expr '/' expr { $$ = $1 / $3; } 196 | expr '%' expr { $$ = (long)$1 % (long)$3; } 197 | '-' expr %prec UMINUS { $$ = -$2; } 198 | '(' expr ')' { $$ = $2; } 199 | VARNAME { $$ = getfval($1); } 200 | NUMBER 201 | place DOTX { $$ = getcomp($1, $2); } 202 | place DOTY { $$ = getcomp($1, $2); } 203 | place DOTHT { $$ = getcomp($1, $2); } 204 | place DOTWID { $$ = getcomp($1, $2); } 205 | place DOTRAD { $$ = getcomp($1, $2); } 206 ; 207