4 #include <ginac/ginac.h>
6 #include <basic/Dynamic_Array.h>
7 #include <basic/Exit.h>
8 #include <code_gen/mmap-codegen.h>
11 #include <omega/calc_debug.h>
14 #define isatty _isatty
16 #define alloca _alloca
19 extern "C" int yywrap() {return 1;};
21 using namespace omega;
23 #if defined BRAIN_DAMAGED_FREE
25 void *realloc(void *p, size_t s);
27 #define free(x) free((char *)(x))
31 void initializeScanBuffer() {
34 void flushScanBuffer() {
35 fprintf(yyout,"# %s\n",scanBuf);
36 if (omega_calc_debug) fprintf(DebugFile,"# %s\n",scanBuf);
37 initializeScanBuffer();
39 #define BUFFER strcat(scanBuf,yytext)
40 void yyerror(const char *s) {
41 fprintf(stderr,"%s\n",s);
42 fprintf(stderr,"line %d, at end of \"%s\"\n",yylineno,scanBuf);
45 #define MAX_INCLUDE_DEPTH 10
46 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
47 int include_stack_ptr = 0;
49 void includeFile(char *s) {
50 if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
52 fprintf( stderr, "Includes nested too deeply" );
56 include_stack[include_stack_ptr++] =
59 FILE *f = fopen( yytext, "r" );
63 fprintf( stderr, "Can't open %s\n",s);
68 yy_create_buffer( yyin, YY_BUF_SIZE ) );
81 "<<" {BUFFER; BEGIN(INCLUDE); }
82 <INCLUDE>[^>\n ]+">>" { BUFFER;
84 while (*s != '>') s++;
90 <INCLUDE>[ \n] { fprintf(stderr,"Error in include syntax\n");
91 fprintf(stderr,"Use <<fname>> to include the file named fname\n");
97 <LATEX>"\\ " { BUFFER; }
99 (#[^\n]*\n) {strncat(scanBuf,yytext,yyleng-1);yylineno++;flushScanBuffer();}
101 <LATEX>"\$\$" { BUFFER; BEGIN 0; }
102 "\$\$" { BUFFER; BEGIN LATEX; }
103 <LATEX>"\\t" { BUFFER; }
104 <LATEX>"\\!" { BUFFER; }
105 <LATEX>"\\\\" { BUFFER; }
107 "\n" { yylineno++; flushScanBuffer(); }
108 "{" { BUFFER; return OPEN_BRACE; }
109 <LATEX>"\\{" { BUFFER; return OPEN_BRACE; }
110 "}" { BUFFER; return CLOSE_BRACE; }
111 <LATEX>"\\}" { BUFFER; return CLOSE_BRACE; }
112 "approximate" { BUFFER; return APPROX; }
113 "union" { BUFFER; return UNION; }
114 <LATEX>"\\cup" { BUFFER; return UNION; }
115 "intersection" { BUFFER; return INTERSECTION; }
116 <LATEX>"\\cap" { BUFFER; return INTERSECTION; }
117 "symbolic" { BUFFER; return SYMBOLIC; }
118 "sym" { BUFFER; return SYMBOLIC; }
119 <LATEX>"\\mid" { BUFFER; return VERTICAL_BAR; }
120 <LATEX>"|" { BUFFER; return VERTICAL_BAR; }
121 <LATEX>"\\st" { BUFFER; return SUCH_THAT; }
122 "s.t." { BUFFER; return SUCH_THAT; }
123 "inverse" { BUFFER; return INVERSE; }
124 "complement" { BUFFER; return COMPLEMENT; }
125 <LATEX>"\\circ" { BUFFER; return COMPOSE; }
126 "compose" { BUFFER; return COMPOSE; }
127 "difference" { BUFFER; return DIFFERENCE; }
128 "diffToRel" { BUFFER; return DIFFERENCE_TO_RELATION; }
129 "project away symbols" { BUFFER; return PROJECT_AWAY_SYMBOLS; }
130 "project_away_symbols" { BUFFER; return PROJECT_AWAY_SYMBOLS; }
131 "projectAwaySymbols" { BUFFER; return PROJECT_AWAY_SYMBOLS; }
132 "project on symbols" { BUFFER; return PROJECT_ON_SYMBOLS; }
133 "project_on_symbols" { BUFFER; return PROJECT_ON_SYMBOLS; }
134 "projectOnSymbols" { BUFFER; return PROJECT_ON_SYMBOLS; }
135 <LATEX>"\\join" { BUFFER; return JOIN; }
136 "\." { BUFFER; return JOIN; }
137 "join" { BUFFER; return JOIN; }
138 "domain" { BUFFER; return OMEGA_DOMAIN; }
139 "time" { BUFFER; return TIME; }
140 "timeclosure" { BUFFER; return TIMECLOSURE; }
141 "range" { BUFFER; return RANGE; }
142 <LATEX>"\\forall" { BUFFER; return FORALL; }
143 "forall" { BUFFER; return FORALL; }
144 <LATEX>"\\exists" { BUFFER; return EXISTS; }
145 "exists" { BUFFER; return EXISTS; }
146 "PairwiseCheck" { BUFFER; return PAIRWISE_CHECK; }
147 "Venn" { BUFFER; return VENN; }
148 "ConvexCheck" { BUFFER; return CONVEX_CHECK; }
149 "ConvexCombination" { BUFFER; return CONVEX_COMBINATION; }
150 "PositiveCombination" { BUFFER; return POSITIVE_COMBINATION; }
151 "ConvexHull" { BUFFER; return CONVEX_HULL; }
152 "AffineHull" { BUFFER; return AFFINE_HULL; }
153 "ConicHull" { BUFFER; return CONIC_HULL; }
154 "LinearHull" { BUFFER; return LINEAR_HULL; }
155 "hull" { BUFFER; return HULL; }
156 "bmax" { BUFFER; return BMAX; }
157 "minimize" { BUFFER; return MINIMIZE; }
158 "maximize" { BUFFER; return MAXIMIZE; }
159 "minimize-range" { BUFFER; return MINIMIZE_RANGE; }
160 "maximize-range" { BUFFER; return MAXIMIZE_RANGE; }
161 "minimizerange" { BUFFER; return MINIMIZE_RANGE; }
162 "maximizerange" { BUFFER; return MAXIMIZE_RANGE; }
163 "minimize-domain" { BUFFER; return MINIMIZE_DOMAIN; }
164 "maximize-domain" { BUFFER; return MAXIMIZE_DOMAIN; }
165 "minimizedomain" { BUFFER; return MINIMIZE_DOMAIN; }
166 "maximizedomain" { BUFFER; return MAXIMIZE_DOMAIN; }
167 "gist" { BUFFER; return GIST; }
168 "given" { BUFFER; return GIVEN; }
169 "within" { BUFFER; return WITHIN; }
170 "subset" { BUFFER; return SUBSET; }
171 "codegen" { BUFFER; return CODEGEN; }
172 "tcodegen" { BUFFER; return TCODEGEN; }
173 "trans_is" { BUFFER; return TRANS_IS; }
174 "trans-is" { BUFFER; return TRANS_IS; }
175 "set_mmap" { BUFFER; return SET_MMAP; }
176 "set-mmap" { BUFFER; return SET_MMAP; }
177 "unroll_is" { BUFFER; return UNROLL_IS; }
178 "unroll-is" { BUFFER; return UNROLL_IS; }
179 "peel_is" { BUFFER; return PEEL_IS; }
180 "peel-is" { BUFFER; return PEEL_IS; }
181 "spmd" { BUFFER; return SPMD; }
182 "farkas" { BUFFER; return FARKAS; }
183 "decoupledfarkas" { BUFFER; return DECOUPLED_FARKAS; }
184 "decoupled-farkas" { BUFFER; return DECOUPLED_FARKAS; }
185 "decoupled_farkas" { BUFFER; return DECOUPLED_FARKAS; }
186 "upper_bound" { BUFFER; return MAKE_UPPER_BOUND; }
187 "lower_bound" { BUFFER; return MAKE_LOWER_BOUND; }
188 "supersetof" { BUFFER; return SUPERSETOF;}
189 "subsetof" { BUFFER; return SUBSETOF;}
190 "sym_example" { BUFFER; return SYM_SAMPLE;}
191 "example" { BUFFER; return SAMPLE;}
192 "carried_by" { BUFFER; return CARRIED_BY;}
193 "iterations" { BUFFER; return ITERATIONS; }
194 "reachable" { BUFFER; return REACHABLE_FROM; }
195 "reachable of" { BUFFER; return REACHABLE_OF; }
196 "restrict_domain" { BUFFER; return RESTRICT_DOMAIN; }
197 "restrictDomain" { BUFFER; return RESTRICT_DOMAIN; }
198 <LATEX>"\\" { yyerror("Can't use \\ for restrict_domain in Tex mode"); }
199 "\\" { BUFFER; return RESTRICT_DOMAIN; }
200 "restrict_range" { BUFFER; return RESTRICT_RANGE; }
201 "restrictRange" { BUFFER; return RESTRICT_RANGE; }
202 "assertUnsatisfiable" { BUFFER; return ASSERT_UNSAT; }
203 "assert_unsatisfiable" { BUFFER; return ASSERT_UNSAT; }
204 "card" { BUFFER; return CARD; }
205 "sum" { BUFFER; return SUM; }
206 "using" { BUFFER; return USING; }
207 "barvinok" { BUFFER; return BARVINOK; }
208 "parker" { BUFFER; return PARKER; }
209 "ranking" { BUFFER; return RANKING; }
210 "count_lexsmaller" { BUFFER; return COUNT_LEXSMALLER; }
211 "vertices" { BUFFER; return VERTICES; }
212 "dump" { BUFFER; return DUMP; }
213 "&" { BUFFER; return AND; }
214 "|" { BUFFER; return OR; }
215 "&&" { BUFFER; return AND; }
216 "||" { BUFFER; return OR; }
217 "and" { BUFFER; return AND; }
218 "or" { BUFFER; return OR; }
219 <LATEX>"\\land" { BUFFER; return AND; }
220 <LATEX>"\\lor" { BUFFER; return OR; }
221 "!" { BUFFER; return NOT; }
222 "not" { BUFFER; return NOT; }
223 <LATEX>"\\neg" { BUFFER; return NOT; }
224 ":=" { BUFFER; return IS_ASSIGNED; }
225 "->" { BUFFER; return GOES_TO; }
226 "in" { BUFFER; return IN; }
227 <LATEX>"\\rightarrow" { BUFFER; return GOES_TO; }
228 "<=" { BUFFER; yylval.REL_OPERATOR = leq;
231 <LATEX>"\\leq" { BUFFER; yylval.REL_OPERATOR = leq;
234 <LATEX>"\\le" { BUFFER; yylval.REL_OPERATOR = leq;
237 ">=" { BUFFER; yylval.REL_OPERATOR = geq;
240 <LATEX>"\\geq" { BUFFER; yylval.REL_OPERATOR = geq;
243 <LATEX>"\\ge" { BUFFER; yylval.REL_OPERATOR = geq;
246 "!=" { BUFFER; yylval.REL_OPERATOR = neq;
249 <LATEX>"\\neq" { BUFFER; yylval.REL_OPERATOR = neq;
252 "<" { BUFFER; yylval.REL_OPERATOR = lt;
255 ">" { BUFFER; yylval.REL_OPERATOR = gt;
258 "=" { BUFFER; yylval.REL_OPERATOR = eq;
261 [A-Za-z][A-Za-z0-9_']* { BUFFER; if (yyleng > 19) yyerror("Identifier too long");
262 yylval.VAR_NAME = (char *) malloc(1+yyleng);
263 strcpy(yylval.VAR_NAME,yytext);
266 [A-Za-z][A-Za-z0-9_]*"(in)" { BUFFER; if (yyleng > 19) yyerror("Identifier too long");
267 yylval.VAR_NAME = (char *) malloc(1+yyleng);
268 strcpy(yylval.VAR_NAME,yytext);
269 yylval.VAR_NAME[yyleng-3] = 'i'; // lowercase
270 yylval.VAR_NAME[yyleng-2] = 'n';
273 [A-Za-z][A-Za-z0-9_]*"(set)" { BUFFER; if (yyleng > 19) yyerror("Identifier too long");
274 yylval.VAR_NAME = (char *) malloc(1+yyleng);
275 strcpy(yylval.VAR_NAME,yytext);
276 yylval.VAR_NAME[yyleng-4] = 'i'; // Change to "in"
277 yylval.VAR_NAME[yyleng-3] = 'n'; // Be afraid
278 yylval.VAR_NAME[yyleng-2] = ')';
279 yylval.VAR_NAME[yyleng-1] = '\0';
282 [A-Za-z][A-Za-z0-9_]*"(out)" { BUFFER; if (yyleng > 19) yyerror("Identifier too long");
283 yylval.VAR_NAME = (char *) malloc(1+yyleng);
284 strcpy(yylval.VAR_NAME,yytext);
285 yylval.VAR_NAME[yyleng-4] = 'o'; // lowercase
286 yylval.VAR_NAME[yyleng-3] = 'u';
287 yylval.VAR_NAME[yyleng-2] = 't';
291 <LATEX>"\\"[A-Za-z][A-Za-z0-9_]* { BUFFER;
292 if (yyleng > 19) yyerror("Identifier too long");
293 yylval.VAR_NAME = (char *) malloc(1+yyleng);
294 strcpy(yylval.VAR_NAME,yytext);
297 <LATEX>"\\"[A-Za-z][A-Za-z0-9_]*"(in)" { BUFFER; if (yyleng > 19) yyerror("Identifier too long");
298 yylval.VAR_NAME = (char *) malloc(1+yyleng);
299 strcpy(yylval.VAR_NAME,yytext);
300 yylval.VAR_NAME[yyleng-3] = 'i'; // lowercase
301 yylval.VAR_NAME[yyleng-2] = 'n';
304 <LATEX>"\\"[A-Za-z][A-Za-z0-9_]*"(set)" { BUFFER; if (yyleng > 19) yyerror("Identifier too long");
305 yylval.VAR_NAME = (char *) malloc(1+yyleng);
306 strcpy(yylval.VAR_NAME,yytext);
307 yylval.VAR_NAME[yyleng-4] = 'i'; // Change to "in"
308 yylval.VAR_NAME[yyleng-3] = 'n'; // Be afraid
309 yylval.VAR_NAME[yyleng-2] = ')';
310 yylval.VAR_NAME[yyleng-1] = '\0';
313 <LATEX>"\\"[A-Za-z][A-Za-z0-9_]*"(out)" { BUFFER; if (yyleng > 19) yyerror("Identifier too long");
314 yylval.VAR_NAME = (char *) malloc(1+yyleng);
315 strcpy(yylval.VAR_NAME,yytext);
316 yylval.VAR_NAME[yyleng-4] = 'o'; // lowercase
317 yylval.VAR_NAME[yyleng-3] = 'u';
318 yylval.VAR_NAME[yyleng-2] = 't';
321 [0-9]+ { BUFFER; yylval.INT_VALUE = atoi(yytext);
325 yytext[strlen(yytext)-1]='\0';
326 yylval.STRING_VALUE = new String(yytext+1);
330 if ( --include_stack_ptr < 0 )
336 yy_delete_buffer( YY_CURRENT_BUFFER );
338 include_stack[include_stack_ptr] );
342 . { BUFFER; return yytext[0]; }