Thread View: gnu.utils.bug
1 messages
1 total messages
Started by Dinesh Venkatachalam x5498
Thu, 27 Aug 1992 01:27
Follow up for my bug report on BISON
Author: Dinesh Venkatachalam x5498
Date: Thu, 27 Aug 1992 01:27
Date: Thu, 27 Aug 1992 01:27
618 lines
14006 bytes
14006 bytes
Version of Bison: char *version_string="GNU Bison version 1.11\n";
I had sent the "parser.y" file with lines stripped out to remove errors.
Here is the file which produces the errors
----------------------- parser.y -----------------------------------
/*
Lex + Yacc
*/
%{
#define YYDEBUG 1
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <fcntl.h>
#define out(c) putc(c,yyout)
#define NCOM 300
int bug=0, ind ;
FILE *fopen(), *freopen(), *fi, *ft, *fo, *fr ;
static int i, comment=0;
char *cp, *st, refd[20], part[20] ;
char ln[80] ;
/* yydebug = 1; *//* div */
extern char *strsave(), *malloc();
extern int yyleng, lexval ;
/* Use this or union below */
typedef struct YYS_TYPE {
int i;
char s[50];
} yys_type ;
#define YYSTYPE yys_type
/*
typedef union
{
int i;
char s[50];
} YYSTYPE;
*/
%}
%token NL NAME NUMBER MODULE ENDMODULE WIRE INPUT OUTPUT INOUT
%token NETTYPE ASSIGN STRENGTH0 STRENGTH1 GATETYPE INIT
%token PARAMETER REG TIME INTEGER REAL EVENT DEFPARAM
%token BIN_OP UNARY_OP PRIMITIVE ENDPRIM TABLE ENDTABLE
%token OUT_SYM LEV_SYM EDGE_SYM
%token TEXT TASK ENDTASK ALWAYS CONSTANT /* div */
%token FUNCTN ENDFUNCTN BEGINS END IF ELSE CASE CASEX CASEZ FOREVER REPEAT
%token WHILE FOR WAIT POINTAT DISABLE DEASSIGN FORK JOIN
%token DEFAULT ENDCASE LOGICAL_OP SPECIFY POSEDGE NEGEDGE /* div */
%right '='
%left BIN_OP
%nonassoc LOGICAL_OP
%start modules /* Start Here */
%%
/* error modified */
modules : modules mod_prim
| modules error ';'
| mod_prim
;
mod_prim : module
| primitive
;
primitive : PRIMITIVE NAME '(' list_of_vars ')' ';' prim_body ENDPRIM
;
list_of_vars : list_of_vars ',' NAME
| NAME
;
prim_body : UDP_decl UDP_init table_def
| UDP_decl table_def
;
UDP_decl : output_decl
| input_decl
| reg_decl
;
UDP_init : INIT NAME '=' init_val
;
init_val : '1' '\'' 'b' '0'
| '1' '\'' 'b' '1'
| '1' '\'' 'b' 'x'
| '1'
| '0'
;
table_def : TABLE table_entries ENDTABLE
;
table_entries : table_entries combin_entry
| combin_entry
| table_entries seq_entry
| seq_entry
;
combin_entry : level_in_list ':' OUT_SYM ';'
;
seq_entry : level_in_list ':' state ':' next_state ';'
| edge_in_list ':' state ':' next_state ';'
;
/* LEX MUST PUT OUT Tokens for OUT_SYM LEV_SYM and EDGE */
level_in_list : LEV_SYM
;
edge_in_list : LEV_SYM edge LEV_SYM
| edge
;
edge : '(' LEV_SYM LEV_SYM ')'
| EDGE_SYM
;
state : LEV_SYM
;
next_state : OUT_SYM
;
/* div */
module : MODULE NAME '(' list_of_ports')' ';' mod_body ENDMODULE
{ strcpy(modnam,$1.s); }
| MODULE NAME ';' mod_body ENDMODULE
{ strcpy(modnam,$1.s); }
;
/* It can also be .name_of_port(port_ref) */
list_of_ports : list_of_ports ',' port
| port
;
port : NAME
| NAME '[' const_exp ']'
| NAME '[' const_exp ':' const_exp ']'
;
mod_body : mod_body module_item
| module_item
;
module_item : param_decl
| input_decl
| output_decl
| inout_decl
| net_decl
| reg_decl
| time_decl
| integer_decl
| real_decl
| event_decl
| gate_decl
| module_instant
| defparm_decl
| cont_assign
| specify_blk
| initial_blk
| always_blk
| statements
| task
| functn
| error ';'
;
/* ----------------- Verilog A.2 Declarations ------------------ */
input_decl : INPUT list_vars ';'
| INPUT range list_vars ';'
;
output_decl : OUTPUT list_vars ';'
| OUTPUT range list_vars ';'
;
inout_decl : INOUT list_vars ';'
| INOUT range list_vars ';'
;
/* param vars */
param_decl : PARAMETER param_list ';'
| PARAMETER range param_list ';'
;
param_list : param_list ',' param_eq
| param_eq
;
param_eq : NAME '=' name_or_const
;
name_or_const : NAME
| CONSTANT
;
reg_decl : REG list_vars ';'
| REG range list_vars ';'
;
/* time vars */
time_decl : TIME list_vars ';'
;
/* integer vars */
integer_decl : INTEGER list_vars ';'
;
/* real vars */
real_decl : REAL list_vars ';'
;
/* event NAME -> multiple events ? */
event_decl : EVENT NAME ';'
;
/* ??? */
defparm_decl : DEFPARAM
;
/* ----------------- Verilog A.3 Primitive Instances ------------------ */
/*
Expand LEX GATETYPE
LEX has to pass strength info also
*/
gate_decl : GATETYPE gate_instant
| GATETYPE dr_strength gate_instant
| GATETYPE delay gate_instant
| GATETYPE dr_strength delay gate_instant
;
delay : '#' number
| '#' NAME
;
dr_strength : '(' STRENGTH0 ',' STRENGTH1 ')'
| '(' STRENGTH1 ',' STRENGTH0 ')'
;
gate_instant : NAME '(' exp ')'
;
net_decl : NETTYPE list_vars ';'
| NETTYPE range list_vars ';'
| NETTYPE delay list_vars ';'
| NETTYPE range delay list_vars ';'
;
range : '[' const_exp ':' const_exp ']'
;
list_vars : list_vars ',' NAME '[' NUMBER ']'
| list_vars ',' NAME
| NAME '[' NUMBER ']'
| NAME
;
/* ----------------- Verilog A.4 Module Instantiations ------------- */
module_instant : name_mod mod_inst_list ';'
| name_mod par_val mod_inst_list ';'
| name_task ';'
;
name_mod : NAME
{ strcpy( part, yytext); }
;
name_task : NAME
;
mod_inst_list : mod_inst_list ',' mod_inst
| mod_inst
;
/* The 3rd definition is for task calls */
mod_inst : reference '(' list_mod_conn ')'
| reference '(' list_nam_conn ')'
| '(' list_vars ')'
;
reference : NAME
{ strcpy( refd, yytext); }
;
list_mod_conn : list_mod_conn ',' exp
| exp
;
list_nam_conn : list_nam_conn ',' nam_conn
| nam_conn
;
nam_conn : '.' NAME '(' sig_nam ')'
{
fprintf(fo,"%-18s %-22s %-10s %10s %s\n",
$4.s, refd, $2.s, part, modnam);
fprintf(fo,"Dollar Num %s %s %s %s %s\n",
$1, $2, $3, $4, $5);
fprintf(fo,"Dollar Num Dot S %s %s %s %s %s\n",
$1.s, $2.s, $3.s, $4.s, $5.s);
fprintf(fo,"Dollar Dollar %s\n",
$$);
fprintf(fo,"------------------\n");
}
;
sig_nam : NAME
| NAME '[' exp ']'
{ strcpy($$.s, $1.s);
strcat($$.s, "[");
strcat($$.s, $3.s);
strcat($$.s, "]");
}
| NAME '[' exp ':' exp ']'
{ strcpy($$.s, $1.s);
strcat($$.s, "[");
strcat($$.s, $3.s);
strcat($$.s, ":");
strcat($$.s, $5.s);
strcat($$.s, "]");
}
| concatenation
{ strcpy($$.s, "concatenation");}
;
par_val : '#' '(' exp ')'
;
cont_assign : ASSIGN list_assigns ';'
| ASSIGN dr_strength list_assigns ';'
| ASSIGN delay list_assigns ';'
| ASSIGN dr_strength delay list_assigns ';'
;
list_assigns : list_assigns ',' assignment
| assignment
;
assignment : lvalue '=' exp
| lvalue '=' '(' exp ')'
;
lvalue : NAME
| NAME '[' exp ']'
| concatenation
;
const_exp : exp
;
concatenation : '{' exp_list '}'
;
exp_list : exp_list ',' exp
| exp
;
exp : primary
| UNARY_OP primary
| UNARY_OP '(' exp ')'
| exp BIN_OP exp
| exp LOGICAL_OP '=' exp
| exp LOGICAL_OP exp
;
primary : number
| CONSTANT
| NAME '[' exp ']'
| NAME
| concatenation
;
number : NUMBER
| NUMBER '\'' 'b' NUMBER
| NUMBER '\'' 'd' NUMBER
| NUMBER '\'' 'o' NUMBER
| NUMBER '\'' 'B' NUMBER
| NUMBER '\'' 'D' NUMBER
| NUMBER '\'' 'O' NUMBER
;
/* Other stuff to complete and debug */
specify_blk : SPECIFY BEGINS statements END
;
/* ----------------- Verilog A.5 Behavioural Statements --------------------------- */
initial_blk : INIT statements
;
always_blk : ALWAYS event_control statements
;
event_control : '@' '(' edge_expr ')'
;
edge_expr : edge_expr GATETYPE rest_of_edge
| rest_of_edge
;
rest_of_edge : POSEDGE NAME
| NEGEDGE NAME
| NAME
;
|
bool_expr : UNARY_OP primary LOGICAL_OP bool_expr
| primary LOGICAL_OP bool_expr
| primary UNARY_OP '=' primary
| primary '=' '=' primary
| UNARY_OP primary
| UNARY_OP '(' bool_expr ')'
| primary
;
statements : statements single_stmt
| single_stmt
;
single_stmt : assignment ';'
| if_exp
| else_exp
| case_exp
| seq_block
| par_block
| forever_stmt
| repeat_stmt
| while_stmt
| for_stmt
| delay_stmt
| event_control
| wait_stmt
| pointat_event
| system_task_stmt
| disable
| null
;
null : ';'
;
if_exp : IF '(' bool_expr ')' statements
;
/* not needed | IF '(' bool_expr ')' ';' */
/* | IF '(' exp ')' statements */
/* | ELSE IF '(' bool_expr ')' statements */
else_exp : ELSE statements
;
case_exp : CASE '(' exp ')' case_item ENDCASE
| CASEZ '(' exp ')' case_item ENDCASE
| CASEX '(' exp ')' case_item ENDCASE
| error ENDCASE
;
case_item : case_body
| DEFAULT ':' statements
;
case_body : exp ':' statements exp ':' statements
| exp ':' statements
;
seq_block : BEGINS statements END
| BEGINS ':' NAME statements END
| error END
;
par_block : FORK statements JOIN
| FORK ':' NAME statements JOIN
| error JOIN
;
forever_stmt : FOREVER statements
;
repeat_stmt : REPEAT '(' exp ')' statements
;
while_stmt : WHILE '(' exp ')' statements
;
for_stmt : FOR '(' assignment ';' exp ';' assignment ')' statements
;
delay_stmt : '#' NUMBER NAME '=' NAME ';'
;
wait_stmt : WAIT '(' NAME ')' ';'
;
pointat_event : POINTAT NAME ';'
;
system_task_stmt : '$' NAME ';'
;
disable : DISABLE NAME ';'
;
task : TASK NAME ';' task_body ENDTASK
;
task_body : NAME NAME
;
functn : FUNCTN NAME ';' function_body ENDFUNCTN
;
function_body : NAME NAME
;
%% /* start of main */
#include "lex.yy.c" /* extern int yylex(); */
main(argc,argv)
int argc;
char *argv[];
{
int i,p;
char frnam[60], fsnam[60];
if(argc == 1) {
fprintf(stderr,"use:hdl [-ds] file\n"); exit(1);
}
for(i=1; i<argc; i++)
if(argv[i][0] == '-'){
bug = ((argv[i][1] == 'd') || (argv[i][2] == 'd'));
}
else break;
if(freopen( argv[i],"r",stdin) == NULL){
fprintf(stderr,"can't open %s\n", argv[i]);exit(1);
} else {
/* open output */
for( cp=argv[i], st=fsnam ; *cp && *cp != '.' ; )*st++ = *cp++;
*st = 0;
strcpy( frnam, fsnam );
strcat( frnam, ".nam"); strcat( fsnam, ".seq");
if((fo = fopen(fsnam, "w")) == NULL) err("can't open %s",fsnam);
fprintf(stderr,"reading nets from %s\n", argv[i]);
}
yyparse() ;
fclose(fo);
fprintf(stderr,"sorting...\n");
sprintf(ln, "sort <%s >%s", fsnam, frnam); system(ln);
}
int yyleng ;
char yytext[YYLMAX];
char yysbuf[YYLMAX];
/* char modnam[YYLMAX]; */
char modnam[20];
int yylast, toklast;
extern char *yysptr;
extern int yylineno;
extern FILE *yyout;
#define YYNL 10
err(s,t)
char *s,*t;
{
fprintf(stderr,s,t);
fprintf(stderr,"\n");
exit(1);
}
yyerror(s) char *s;
{
fprintf(stderr,"%s error on line %d\n",s,yylineno);
}
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads