home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #19 / NN_1992_19.iso / spool / gnu / utils / bug / 1429 < prev    next >
Encoding:
Text File  |  1992-08-27  |  13.1 KB  |  634 lines

  1. Newsgroups: gnu.utils.bug
  2. Path: sparky!uunet!cis.ohio-state.edu!nad.3com.COM!div
  3. From: div@nad.3com.COM (Dinesh Venkatachalam x5498)
  4. Subject: Follow up for my bug report on BISON
  5. Message-ID: <199208271527.AA14064@patience.NAD.3Com.COM>
  6. Sender: gnulists@ai.mit.edu
  7. Organization: GNUs Not Usenet
  8. Distribution: gnu
  9. Date: Thu, 27 Aug 1992 01:27:19 GMT
  10. Approved: bug-gnu-utils@prep.ai.mit.edu
  11. Lines: 621
  12.  
  13. Version of Bison: char *version_string="GNU Bison version 1.11\n";
  14.  
  15. I had sent the "parser.y" file with lines stripped out to remove errors.
  16. Here is the file which produces the errors
  17.  
  18. ----------------------- parser.y -----------------------------------
  19. /*
  20.       Lex + Yacc
  21. */
  22. %{
  23. #define YYDEBUG 1
  24. #include <string.h>
  25. #include <ctype.h>
  26. #include <errno.h>
  27. #include <stdio.h>
  28. #include <fcntl.h>
  29.  
  30. #define out(c) putc(c,yyout)
  31. #define NCOM 300
  32.  
  33. int    bug=0, ind ;
  34. FILE     *fopen(), *freopen(), *fi, *ft, *fo, *fr ;
  35. static     int i, comment=0;
  36. char      *cp, *st, refd[20], part[20] ;
  37. char    ln[80] ;
  38.  
  39. /* yydebug = 1; *//* div */
  40.  
  41. extern char     *strsave(), *malloc();
  42. extern int    yyleng, lexval ;
  43.  
  44. /* Use this or union below */
  45.  
  46. typedef struct YYS_TYPE {
  47.     int i;
  48.     char s[50];
  49.     } yys_type ;
  50. #define YYSTYPE     yys_type
  51.  
  52. /*
  53. typedef union 
  54. {
  55.     int i;
  56.     char s[50];
  57. } YYSTYPE;
  58. */
  59.  
  60. %}
  61.  
  62. %token NL NAME NUMBER MODULE ENDMODULE WIRE INPUT OUTPUT INOUT
  63. %token NETTYPE ASSIGN STRENGTH0 STRENGTH1 GATETYPE INIT
  64. %token PARAMETER REG TIME INTEGER REAL EVENT DEFPARAM
  65. %token BIN_OP UNARY_OP PRIMITIVE ENDPRIM TABLE ENDTABLE
  66. %token OUT_SYM LEV_SYM EDGE_SYM
  67. %token TEXT TASK ENDTASK ALWAYS CONSTANT /* div */
  68. %token FUNCTN ENDFUNCTN BEGINS END IF ELSE CASE CASEX CASEZ FOREVER REPEAT
  69. %token WHILE FOR WAIT POINTAT DISABLE DEASSIGN FORK JOIN 
  70. %token DEFAULT ENDCASE LOGICAL_OP SPECIFY POSEDGE NEGEDGE /* div */
  71.  
  72. %right '='
  73. %left BIN_OP
  74. %nonassoc LOGICAL_OP
  75.  
  76. %start modules        /* Start Here */
  77.  
  78. %%
  79.  
  80. /* error modified */
  81. modules     : modules mod_prim
  82.                 | modules         error ';'
  83.         |            mod_prim
  84.         ;
  85.  
  86. mod_prim    : module
  87.         | primitive
  88.         ;
  89.  
  90. primitive    : PRIMITIVE NAME '(' list_of_vars ')' ';' prim_body ENDPRIM
  91.         ;
  92.  
  93. list_of_vars    : list_of_vars ',' NAME
  94.         | NAME
  95.         ;
  96.  
  97. prim_body    : UDP_decl UDP_init table_def
  98.         | UDP_decl          table_def
  99.         ;
  100.  
  101. UDP_decl    : output_decl
  102.         | input_decl
  103.         | reg_decl
  104.         ;
  105.  
  106. UDP_init    : INIT NAME '=' init_val
  107.         ;
  108.  
  109. init_val    : '1' '\'' 'b' '0'
  110.         | '1' '\'' 'b' '1'
  111.         | '1' '\'' 'b' 'x'
  112.         | '1'
  113.         | '0'
  114.         ;
  115.  
  116. table_def    : TABLE table_entries ENDTABLE
  117.         ;
  118.  
  119. table_entries    : table_entries combin_entry
  120.         |               combin_entry
  121.         | table_entries seq_entry
  122.         |               seq_entry
  123.         ;
  124.  
  125. combin_entry    : level_in_list ':' OUT_SYM ';'
  126.         ;
  127.  
  128. seq_entry    : level_in_list ':' state ':' next_state ';'
  129.         |  edge_in_list ':' state ':' next_state ';'
  130.         ;
  131.  
  132. /* LEX MUST PUT OUT Tokens for OUT_SYM LEV_SYM and EDGE */
  133.  
  134. level_in_list     : LEV_SYM
  135.         ;
  136.  
  137. edge_in_list    : LEV_SYM edge LEV_SYM
  138.         |         edge
  139.         ;
  140.  
  141. edge        : '(' LEV_SYM LEV_SYM ')'
  142.         | EDGE_SYM
  143.         ;
  144.  
  145. state        : LEV_SYM
  146.         ;
  147. next_state    : OUT_SYM
  148.         ;
  149. /* div */
  150. module        : MODULE NAME '(' list_of_ports')' ';' mod_body ENDMODULE  
  151.                        { strcpy(modnam,$1.s); }
  152.                 | MODULE NAME ';' mod_body ENDMODULE 
  153.                        { strcpy(modnam,$1.s); }
  154.                 ;
  155.  
  156. /* It can also be .name_of_port(port_ref) */
  157.                 
  158. list_of_ports    : list_of_ports ',' port 
  159.         | port
  160.         ;
  161.  
  162. port        : NAME
  163.         | NAME '[' const_exp ']'
  164.         | NAME '[' const_exp ':' const_exp ']'
  165.         ;
  166.  
  167. mod_body    : mod_body module_item 
  168.         |          module_item 
  169.         ;
  170.  
  171. module_item    : param_decl
  172.         | input_decl
  173.         | output_decl
  174.         | inout_decl
  175.         | net_decl
  176.         | reg_decl
  177.         | time_decl
  178.         | integer_decl
  179.         | real_decl
  180.         | event_decl
  181.         | gate_decl
  182.         | module_instant
  183.         | defparm_decl
  184.         | cont_assign
  185.                 | specify_blk
  186.                 | initial_blk
  187.                 | always_blk
  188.                 | statements
  189.                 | task
  190.                 | functn
  191.                 | error ';'
  192.         ;
  193.  
  194.  
  195. /* -----------------  Verilog A.2 Declarations ------------------ */
  196.  
  197. input_decl    : INPUT       list_vars ';'
  198.         | INPUT range list_vars ';'
  199.         ;
  200.  
  201. output_decl    : OUTPUT       list_vars ';'
  202.         | OUTPUT range list_vars ';'
  203.         ;
  204.  
  205. inout_decl    : INOUT       list_vars ';'
  206.         | INOUT range list_vars ';'
  207.         ;
  208.  
  209. /* param vars */
  210. param_decl    : PARAMETER       param_list ';'
  211.                 | PARAMETER range param_list ';'
  212.         ;
  213.  
  214. param_list      : param_list ',' param_eq
  215.                 |                param_eq
  216.                 ;
  217.  
  218. param_eq        : NAME '=' name_or_const
  219.                 ;
  220.  
  221. name_or_const   : NAME
  222.                 | CONSTANT
  223.                 ;
  224.  
  225. reg_decl    : REG list_vars ';'
  226.                 | REG range list_vars ';'
  227.         ;
  228.  
  229. /* time vars */
  230. time_decl    : TIME list_vars ';'
  231.         ;
  232.  
  233. /* integer vars */
  234. integer_decl    : INTEGER list_vars ';'
  235.         ;
  236.  
  237. /* real vars */
  238. real_decl    : REAL list_vars ';'
  239.         ;
  240.  
  241. /* event NAME -> multiple events ? */
  242. event_decl    : EVENT NAME ';'
  243.         ;
  244.  
  245. /* ??? */
  246. defparm_decl    : DEFPARAM
  247.         ;
  248. /* -----------------  Verilog A.3 Primitive Instances ------------------ */
  249.  
  250. /*
  251.    Expand LEX GATETYPE
  252.    LEX has to pass strength info also
  253. */
  254. gate_decl    : GATETYPE                   gate_instant
  255.         | GATETYPE dr_strength       gate_instant
  256.         | GATETYPE             delay gate_instant
  257.         | GATETYPE dr_strength delay gate_instant
  258.         ;
  259.  
  260. delay        : '#' number
  261.         | '#' NAME
  262.         ;
  263.  
  264. dr_strength    : '(' STRENGTH0 ',' STRENGTH1 ')'
  265.         | '(' STRENGTH1 ',' STRENGTH0 ')'
  266.         ;
  267.  
  268. gate_instant    : NAME '(' exp ')'
  269.         ;
  270.  
  271. net_decl    : NETTYPE             list_vars ';'
  272.         | NETTYPE range       list_vars ';'
  273.         | NETTYPE       delay list_vars ';'
  274.         | NETTYPE range delay list_vars ';'
  275.         ;
  276.  
  277. range        : '[' const_exp ':' const_exp ']' 
  278.         ;
  279.  
  280. list_vars    : list_vars ',' NAME '[' NUMBER ']'
  281.                 | list_vars ',' NAME 
  282.         |               NAME '[' NUMBER ']'
  283.                 |               NAME
  284.         ;
  285.  
  286. /* -----------------  Verilog A.4 Module Instantiations ------------- */
  287.  
  288. module_instant    : name_mod         mod_inst_list ';' 
  289.                   | name_mod par_val mod_inst_list ';' 
  290.                 | name_task                      ';'
  291.         ;
  292.  
  293. name_mod    : NAME
  294.         { strcpy( part, yytext); }
  295.         ;
  296.  
  297. name_task       : NAME
  298.                 ;
  299.  
  300. mod_inst_list    : mod_inst_list ',' mod_inst
  301.         |                   mod_inst
  302.         ;
  303.  
  304. /* The 3rd definition is for task calls  */
  305.  
  306. mod_inst    : reference '(' list_mod_conn ')'
  307.             | reference '(' list_nam_conn ')'
  308.                 |           '(' list_vars     ')'
  309.         ;
  310.  
  311. reference    : NAME
  312.         { strcpy( refd, yytext); }
  313.         ;
  314.  
  315. list_mod_conn    : list_mod_conn ',' exp
  316.         |                   exp
  317.         ;
  318.  
  319. list_nam_conn    : list_nam_conn ',' nam_conn
  320.         |                   nam_conn
  321.         ;
  322.  
  323. nam_conn    : '.' NAME '(' sig_nam ')'
  324.         {
  325.             fprintf(fo,"%-18s %-22s %-10s %10s %s\n",
  326.              $4.s, refd, $2.s, part, modnam);
  327.             fprintf(fo,"Dollar Num %s %s %s %s %s\n",
  328.              $1, $2, $3, $4, $5);
  329.             fprintf(fo,"Dollar Num Dot S %s %s %s %s %s\n",
  330.              $1.s, $2.s, $3.s, $4.s, $5.s);
  331.             fprintf(fo,"Dollar Dollar %s\n",
  332.              $$);
  333.                     fprintf(fo,"------------------\n");
  334.     
  335.         }
  336.         ;
  337.  
  338. sig_nam        : NAME
  339.         | NAME '[' exp ']'
  340.         { strcpy($$.s, $1.s);
  341.           strcat($$.s, "[");
  342.           strcat($$.s, $3.s);
  343.           strcat($$.s, "]");
  344.         }
  345.         | NAME '[' exp ':' exp ']'
  346.         { strcpy($$.s, $1.s);
  347.           strcat($$.s, "[");
  348.           strcat($$.s, $3.s);
  349.           strcat($$.s, ":");
  350.           strcat($$.s, $5.s);
  351.           strcat($$.s, "]");
  352.         }
  353.         | concatenation
  354.         { strcpy($$.s, "concatenation");}
  355.         ;
  356.  
  357. par_val        : '#' '(' exp ')' 
  358.         ;
  359.  
  360. cont_assign    : ASSIGN                   list_assigns ';'
  361.         | ASSIGN dr_strength       list_assigns ';'
  362.         | ASSIGN             delay list_assigns ';'
  363.         | ASSIGN dr_strength delay list_assigns ';'
  364.         ;
  365.  
  366. list_assigns    : list_assigns ',' assignment
  367.         |                  assignment
  368.         ;
  369.  
  370. assignment    : lvalue '='     exp
  371.         | lvalue '=' '(' exp ')'
  372.         ;
  373.  
  374. lvalue        : NAME
  375.         | NAME '[' exp ']'
  376.         | concatenation
  377.         ;
  378.  
  379. const_exp    : exp
  380.         ;
  381.  
  382. concatenation    : '{' exp_list '}'
  383.         ;
  384.  
  385. exp_list    : exp_list ',' exp
  386.         |              exp
  387.         ;
  388.      
  389. exp        : primary
  390.                 | UNARY_OP primary
  391.         | UNARY_OP '(' exp ')'
  392.         | exp BIN_OP exp
  393.                 | exp LOGICAL_OP '=' exp
  394.                 | exp LOGICAL_OP exp
  395.         ;
  396.  
  397. primary        : number
  398.                 | CONSTANT
  399.         | NAME '[' exp ']'
  400.         | NAME
  401.         | concatenation
  402.         ;
  403.  
  404. number        : NUMBER
  405.         | NUMBER '\'' 'b' NUMBER
  406.         | NUMBER '\'' 'd' NUMBER
  407.         | NUMBER '\'' 'o' NUMBER
  408.         | NUMBER '\'' 'B' NUMBER
  409.         | NUMBER '\'' 'D' NUMBER
  410.         | NUMBER '\'' 'O' NUMBER
  411.         ;
  412.  
  413. /* Other stuff to complete and debug */
  414.  
  415. specify_blk     : SPECIFY BEGINS statements END
  416.                 ;
  417.  
  418.  
  419. /* ----------------- Verilog A.5 Behavioural Statements --------------------------- */
  420.  
  421. initial_blk       : INIT statements
  422.                   ; 
  423.  
  424. always_blk        : ALWAYS event_control statements
  425.                   ;
  426.  
  427. event_control     : '@' '(' edge_expr ')'
  428.               ;
  429.  
  430. edge_expr         : edge_expr GATETYPE rest_of_edge
  431.                   |                    rest_of_edge
  432.                   ;
  433.  
  434. rest_of_edge      :          POSEDGE NAME
  435.                   |          NEGEDGE NAME
  436.                   |                  NAME
  437.                   ;
  438.  
  439.                   | 
  440. bool_expr         : UNARY_OP primary LOGICAL_OP bool_expr
  441.                   |          primary LOGICAL_OP bool_expr
  442.                   |          primary UNARY_OP '=' primary
  443.                   |          primary '=' '=' primary
  444.                   | UNARY_OP primary
  445.                   | UNARY_OP                '(' bool_expr ')'
  446.                   |          primary 
  447.                   ;
  448.  
  449. statements        : statements single_stmt
  450.                   |            single_stmt
  451.                   ;
  452.     
  453. single_stmt       : assignment ';'
  454.                   | if_exp
  455.                   | else_exp
  456.                   | case_exp
  457.                   | seq_block
  458.                   | par_block
  459.                   | forever_stmt
  460.                   | repeat_stmt
  461.                   | while_stmt
  462.                   | for_stmt
  463.                   | delay_stmt
  464.                   | event_control
  465.                   | wait_stmt
  466.                   | pointat_event
  467.                   | system_task_stmt
  468.                   | disable
  469.                   | null
  470.                   ;
  471.  
  472. null              :  ';'
  473.                   ;
  474.  
  475. if_exp              : IF '(' bool_expr ')' statements 
  476.                   ;
  477.  
  478. /* not needed     | IF '(' bool_expr ')' ';' */
  479. /*                | IF '(' exp ')' statements */
  480. /*                | ELSE IF '(' bool_expr ')' statements */
  481.  
  482. else_exp          : ELSE statements
  483.                   ;
  484.  
  485. case_exp          : CASE  '(' exp ')' case_item ENDCASE
  486.                   | CASEZ '(' exp ')' case_item ENDCASE
  487.                   | CASEX '(' exp ')' case_item ENDCASE
  488.                   |                   error     ENDCASE
  489.               ;
  490.     
  491. case_item         : case_body
  492.                   | DEFAULT ':' statements
  493.                   ;
  494.  
  495. case_body         : exp ':' statements exp ':' statements
  496.                   |                    exp ':' statements
  497.                   ;
  498.  
  499. seq_block         : BEGINS          statements END
  500.                   | BEGINS ':' NAME statements END
  501.                   |                 error      END
  502.                   ;
  503.  
  504. par_block         : FORK          statements JOIN
  505.                   | FORK ':' NAME statements JOIN
  506.                   |               error      JOIN
  507.                   ;
  508.  
  509. forever_stmt      : FOREVER statements
  510.                   ;
  511. repeat_stmt       : REPEAT '(' exp ')' statements
  512.                   ;
  513.  
  514. while_stmt        : WHILE '(' exp ')' statements
  515.                   ;
  516.  
  517. for_stmt          : FOR '(' assignment ';' exp ';' assignment ')' statements
  518.                   ;
  519. delay_stmt        : '#' NUMBER NAME '=' NAME ';'
  520.                   ;
  521.  
  522. wait_stmt         : WAIT '(' NAME ')' ';'
  523.                   ;
  524.  
  525. pointat_event     : POINTAT NAME ';'
  526.                   ;
  527.  
  528. system_task_stmt  : '$' NAME ';'
  529.                   ;
  530.  
  531. disable           : DISABLE NAME ';'
  532.                   ;
  533.  
  534. task             : TASK NAME ';' task_body ENDTASK
  535.                  ;
  536.  
  537. task_body        : NAME NAME
  538.                  ;
  539.  
  540.  
  541.  
  542. functn         : FUNCTN NAME ';' function_body ENDFUNCTN
  543.                ;
  544.  
  545. function_body  : NAME NAME
  546.                ;
  547.  
  548.  
  549.     
  550. %%    /* start of main */
  551.  
  552. #include "lex.yy.c"  /* extern int  yylex(); */
  553.  
  554.  
  555. main(argc,argv)
  556. int    argc;
  557. char    *argv[];
  558. {
  559.     int    i,p;
  560.     char frnam[60], fsnam[60];
  561.  
  562.     if(argc == 1) {
  563.     fprintf(stderr,"use:hdl [-ds] file\n"); exit(1);
  564.     }
  565.     for(i=1; i<argc; i++)
  566.         if(argv[i][0] == '-'){
  567.         bug     = ((argv[i][1] == 'd') || (argv[i][2] == 'd'));
  568.     }
  569.     else break;
  570.  
  571.  
  572.     if(freopen( argv[i],"r",stdin) == NULL){
  573.     fprintf(stderr,"can't open %s\n", argv[i]);exit(1);
  574.     }    else {
  575.     /* open output */
  576.     for( cp=argv[i], st=fsnam ; *cp && *cp != '.' ; )*st++ = *cp++;
  577.     *st = 0;
  578.     strcpy( frnam, fsnam );    
  579.     strcat( frnam, ".nam");    strcat( fsnam, ".seq");
  580.  
  581.     if((fo = fopen(fsnam, "w")) == NULL) err("can't open %s",fsnam);
  582.  
  583.     fprintf(stderr,"reading nets from %s\n", argv[i]);
  584.     }
  585.  
  586.     yyparse() ;
  587.     
  588.     fclose(fo);
  589.  
  590.     fprintf(stderr,"sorting...\n");
  591.     sprintf(ln, "sort <%s >%s", fsnam, frnam);    system(ln);
  592. }
  593.  
  594. int     yyleng ;
  595.  
  596. char    yytext[YYLMAX];
  597.  
  598. char    yysbuf[YYLMAX];
  599.  
  600. /* char    modnam[YYLMAX]; */
  601.  
  602. char    modnam[20];
  603.  
  604. int      yylast, toklast;
  605.  
  606. extern char *yysptr;
  607. extern int yylineno;
  608. extern FILE *yyout;
  609.  
  610. #define YYNL 10
  611.  
  612.  
  613. err(s,t)
  614.     char *s,*t;
  615.  
  616. {
  617.  
  618.     fprintf(stderr,s,t);
  619.     fprintf(stderr,"\n");
  620.  
  621.     exit(1);
  622.  
  623. }
  624.  
  625. yyerror(s)    char *s;
  626.  
  627. {
  628.     fprintf(stderr,"%s error on line %d\n",s,yylineno);
  629.  
  630. }
  631.  
  632.  
  633.  
  634.