|
|
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.