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