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