%{ #include #include #include "define.h" extern int yylineno; char inputlist[MAX_FANIN][NAME_LEN], outname[NAME_LEN]; short i, incount; %} %union { int ival; char *sval; } %start file %type type primary_io %token TAND TNAND TOR TNOR TINPUT TOUTPUT %token TNOT TFROM TXOR TXNOR TBUFF TDFF %token NAME %% file : | line | file line ; line : primary_io '(' NAME ')' { if ($1 == INPUT) printf ("INPUT(%s)\n",$3); else printf ("OUTPUT(%s)\n",$3); } | output '=' type '(' inputs ')' { printf ("%s = %s(",outname,getType($3)); for (i = 0; i < incount; i++) if (i == incount - 1) printf ("%s)\n",inputlist[i]); else printf ("%s, ",inputlist[i]); incount = 0; } ; primary_io : TINPUT {$$ = $1;} | TOUTPUT {$$ = $1;} ; inputs : NAME { strcpy (inputlist[0],$1); incount = 1; } | inputs ',' NAME { strcpy (inputlist[incount++],$3); } ; output : NAME { strcpy (outname,$1); } ; type : TAND {$$ = $1;} | TNAND {$$ = $1;} | TOR {$$ = $1;} | TNOR {$$ = $1;} | TXOR {$$ = $1;} | TXNOR {$$ = $1;} | TBUFF {$$ = $1;} | TNOT {$$ = $1;} | TDFF {$$ = $1;} ; %% yyerror () { fprintf (stderr,"syntax error at line %d\n",yylineno); exit (1); } char *getType (inttype) int inttype; { static char and[] = {"AND"}; static char nand[] = {"NAND"}; static char or[] = {"OR"}; static char nor[] = {"NOR"}; static char xor[] = {"XOR"}; static char xnor[] = {"XNOR"}; static char buff[] = {"BUFF"}; static char not[] = {"NOT"}; static char dff[] = {"DFF"}; static char unknown[] = {"UNKNOWN"}; switch (inttype) { case AND: return (and); case NAND: return (nand); case OR: return (or); case NOR: return (nor); case XOR: return (xor); case XNOR: return (xnor); case BUFF: return (buff); case NOT: return (not); case DFF: return (dff); default: { fprintf (stderr,"unknown case in getType: %d\n",inttype); return (unknown); } } }