INCLUDES ///.
Date [Ver. 1.0. Started - September 8, 2003.]
] PARAMETERS /// STRUCTURE DEFINITIONS /// GLOBAL VARIABLES /// MACRO DEFINITIONS /// FUNCTION DEFINITIONS ///
INCLUDES ///.
Description [Takes the stream to output messages, the formula, the number variables and the rank in the formula. The array of variable names is also given. The BDD manager and the elementary 0-rank variable are the last two arguments. The manager should have at least as many variables as nVars * (nRanks + 1). The 0-rank variables should have numbers larger than the variables of other ranks.]
118{
119 char * pFormula;
122 DdNode * bFunc, * bTemp;
123 char * pTemp;
124 int nParans, fFound, Flag;
125 int Oper, Oper1, Oper2;
126 int i, fLower;
127 int v = -1;
128
129
130 if ( nVars * (nRanks + 1) > dd->size )
131 {
132 printf( "Parse_FormulaParser(): The BDD manager does not have enough variables.\n" );
133 return NULL;
134 }
135
136
137 nParans = 0;
138 for ( pTemp = pFormulaInit; *pTemp; pTemp++ )
139 if ( *pTemp == '(' )
140 nParans++;
141 else if ( *pTemp == ')' )
142 nParans--;
143 if ( nParans != 0 )
144 {
145 fprintf( pOutput, "Parse_FormulaParser(): Different number of opening and closing parentheses ().\n" );
146 return NULL;
147 }
148
149 nParans = 0;
150 for ( pTemp = pFormulaInit; *pTemp; pTemp++ )
151 if ( *pTemp == '[' )
152 nParans++;
153 else if ( *pTemp == ']' )
154 nParans--;
155 if ( nParans != 0 )
156 {
157 fprintf( pOutput, "Parse_FormulaParser(): Different number of opening and closing brackets [].\n" );
158 return NULL;
159 }
160
161
163 sprintf( pFormula,
"(%s)", pFormulaInit );
164
165
168
170 fLower = 0;
171 for ( pTemp = pFormula; *pTemp; pTemp++ )
172 {
173 switch ( *pTemp )
174 {
175
176 case ' ':
177 case '\t':
178 case '\r':
179 case '\n':
180 continue;
181
182
186 {
187 fprintf( pOutput, "Parse_FormulaParser(): No operation symbol before constant 0.\n" );
189 break;
190 }
192 break;
193
194
198 {
199 fprintf( pOutput, "Parse_FormulaParser(): No operation symbol before constant 1.\n" );
201 break;
202 }
204 break;
205
209 {
212 }
214 break;
215
218 {
219 fprintf( pOutput, "Parse_FormulaParser(): No variable is specified before the negation suffix.\n" );
221 break;
222 }
223 else
225 break;
226
233 {
234 fprintf( pOutput, "Parse_FormulaParser(): There is no variable before AND, EXOR, or OR.\n" );
236 break;
237 }
242 else
245 break;
246
249 {
250 fprintf( pOutput, "Parse_FormulaParser(): There is no variable before Equivalence or Implication\n" );
252 }
254 {
255 pTemp++;
257 {
258 pTemp++;
260 }
261 else
262 {
264 }
265 }
267 {
268 pTemp++;
270 {
271 pTemp++;
273 }
274 else
275 {
278 break;
279 }
280 }
281 else
282 {
283 fprintf( pOutput,
"Parse_FormulaParser(): Wrong symbol after \"%c\"\n",
PARSE_SYM_EQU1 );
285 break;
286 }
288 break;
289
292 {
293 fprintf( pOutput, "Parse_FormulaParser(): There is no variable before Reverse Implication\n" );
295 break;
296 }
298 {
299 pTemp++;
301 }
302 else
303 {
304 fprintf( pOutput,
"Parse_FormulaParser(): Wrong symbol after \"%c\"\n",
PARSE_SYM_EQU2 );
306 break;
307 }
309 break;
310
316
318 break;
319
321 fLower = 1;
324 {
325 while ( 1 )
326 {
328 {
329 fprintf( pOutput, "Parse_FormulaParser(): There is no opening parenthesis\n" );
331 break;
332 }
335 break;
336
337
338 if ( Parse_ParserPerformTopOp( dd, pStackFn, Oper ) == NULL )
339 {
340 fprintf( pOutput, "Parse_FormulaParser(): Unknown operation\n" );
342 return NULL;
343 }
344 }
345
346 if ( fLower )
347 {
349 bFunc =
Extra_bddMove( dd, bTemp = bFunc, -nVars ); Cudd_Ref( bFunc );
350 Cudd_RecursiveDeref( dd, bTemp );
352 }
353 }
354 else
355 {
356 fprintf( pOutput, "Parse_FormulaParser(): There is no opening parenthesis\n" );
358 break;
359 }
362 fLower = 0;
363 break;
364
365
366 default:
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384 fFound = 0;
385 for ( i = 0; pTemp[i] && pTemp[i] != ' ' && pTemp[i] != '\t' && pTemp[i] != '\r' && pTemp[i] != '\n' &&
390 i++ )
391 {}
392 for ( v = 0; v < nVars; v++ )
393 {
394 if (
strncmp( pTemp, ppVarNames[v], i ) == 0 &&
strlen(ppVarNames[v]) == (
unsigned)(i) )
395 {
396 pTemp += i-1;
397 fFound = 1;
398 break;
399 }
400 }
401
402 if ( !fFound )
403 {
404 fprintf( pOutput, "Parse_FormulaParser(): The parser cannot find var \"%s\" in the input var list.\n", pTemp );
406 break;
407 }
408
413 break;
414 }
415
417 break;
419 continue;
421 while ( 1 )
422 {
424 break;
427 {
429 break;
430 }
431 else
432 {
434 }
435 }
436 else
437 while ( 1 )
438 {
439
442 {
444 break;
445 }
447 if ( Oper2 >= Oper1 )
448 {
449
450 if ( Parse_ParserPerformTopOp( dd, pStackFn, Oper2 ) == NULL )
451 {
452 fprintf( pOutput, "Parse_FormulaParser(): Unknown operation\n" );
454 return NULL;
455 }
457 }
458 else
459 {
462 break;
463 }
464 }
465 }
466
468 {
470 {
474 {
477 Cudd_Deref( bFunc );
479 return bFunc;
480 }
481 else
482 fprintf( pOutput, "Parse_FormulaParser(): Something is left in the operation stack\n" );
483 else
484 fprintf( pOutput, "Parse_FormulaParser(): Something is left in the function stack\n" );
485 }
486 else
487 fprintf( pOutput, "Parse_FormulaParser(): The input string is empty\n" );
488 }
490 return NULL;
491}
#define ABC_ALLOC(type, num)
#define PARSE_SYM_NEGBEF2
#define PARSE_SYM_OPEN
DECLARATIONS ///.
#define PARSE_SYM_NEGBEF1
struct ParseStackOpStruct Parse_StackOp_t
Parse_StackFn_t * Parse_StackFnStart(int nDepth)
GLOBAL VARIABLES ///.
void * Parse_StackFnPop(Parse_StackFn_t *p)
void Parse_StackFnFree(Parse_StackFn_t *p)
void Parse_StackFnPush(Parse_StackFn_t *p, void *bFunc)
Parse_StackOp_t * Parse_StackOpStart(int nDepth)
int Parse_StackOpIsEmpty(Parse_StackOp_t *p)
typedefABC_NAMESPACE_HEADER_START struct ParseStackFnStruct Parse_StackFn_t
INCLUDES ///.
void Parse_StackOpPush(Parse_StackOp_t *p, int Oper)
int Parse_StackFnIsEmpty(Parse_StackFn_t *p)
int Parse_StackOpPop(Parse_StackOp_t *p)
void Parse_StackOpFree(Parse_StackOp_t *p)