📄 y.tab.c,v
字号:
int len;
{
int base, rv;
if (*p == '0') {
++p; --len;
if (*p == 'x' || *p == 'X') {
++p; --len; /* skip 'x' */
base = 16;
} else
base = 8;
} else
base = 10;
rv = 0;
for (; len > 0; ++p, --len) {
rv *= base;
if (isdigit(*p))
rv += *p - '0';
else if (isupper(*p))
rv += *p - 'A' + 10;
else
rv += *p - 'a' + 10;
}
return rv;
}
/* newattr -- add a new attribute spec to current type/device description */
newattr(tok,val)
int tok; /* token type (attribute type) */
int val; /* symbol number of value */
{
char *c;
dvptr s;
if (devs == NIL) /* doing types */
s = currtype;
else
s = lastdv;
if (val>=0 && val<nsym) {
c = symtab[val].symname;
if (strlen(c) > 20 ) {
fprintf(stderr,"Internal overflow\n");
exit(1);
}
} else
c = NULL;
switch (tok) {
case CSR: s->dvcsr = val;
break;
case IVEC: s->dvivec = val;
break;
case OVEC: s->dvovec = val;
break;
case IRQ: s->dvovec = s->dvivec = val;
break;
case IINT: strcpy(s->dviint,c);
break;
case OINT: strcpy(s->dvoint,c);
break;
case READ: strcpy(s->dvread,c);
break;
case WRITE: strcpy(s->dvwrite,c);
break;
case GETC: strcpy(s->dvgetc,c);
break;
case PUTC: strcpy(s->dvputc,c);
break;
case OPEN: strcpy(s->dvopen,c);
break;
case CLOSE: strcpy(s->dvclose,c);
break;
case INIT: strcpy(s->dvinit,c);
break;
case SEEK: strcpy(s->dvseek,c);
break;
case CNTL: strcpy(s->dvcntl,c);
break;
default: fprintf(stderr, "Internal error 1\n");
}
}
/* cktname -- check type name for duplicates */
cktname(symid)
int symid;
{
dvptr s;
extern dvptr ftypes;
char *name;
name = symtab[symid].symname;
for (s=ftypes; s!=NIL ; s=s->dvnext) {
if (s->dvtname == name) {
fprintf(stderr,"Duplicate type name %s on line %d\n",
name,linectr);
exit(1);
}
}
return(symid);
}
/* mktype -- make a node in the type list and initialize to defaults */
mktype(deviceid)
int deviceid;
{
dvptr s,p;
char *tn,*dn;
p = NIL;
tn = symtab[currtname].symname;
dn = symtab[deviceid].symname;
for (s = ftypes; s!=NIL ; s=s->dvnext) {
if (s->dvtname == tn && s->dvdevice==dn) {
fprintf(stderr,
"Duplicate device %s for type %s on line %d\n",
dn, tn, linectr);
exit(1);
}
p = s;
}
currtype = s = (dvptr) malloc( sizeof(struct dvtype));
if (ftypes != NIL) {
p->dvnext = s;
}
else {
ftypes = s;
}
initattr(s, currtname, deviceid);
}
/* initialize attributes in a type declaration node to typename... */
initattr(fstr, tnum, deviceid)
dvptr fstr;
int tnum;
int deviceid;
{
char *typnam;
typnam = symtab[tnum].symname;
fstr->dvname = NULL;
fstr->dvtname = typnam;
fstr->dvtnum = tnum;
fstr->dvdevice = symtab[deviceid].symname;
fstr->dvcsr = 0;
fstr->dvivec = 0;
fstr->dvovec = 0;
strcpy(fstr->dviint,typnam);
strcat(fstr->dviint,"iin");
strcpy(fstr->dvoint,typnam);
strcat(fstr->dvoint,"oin");
strcpy(fstr->dvinit,typnam);
strcat(fstr->dvinit,"init");
strcpy(fstr->dvopen,typnam);
strcat(fstr->dvopen,"open");
strcpy(fstr->dvclose,typnam);
strcat(fstr->dvclose,"close");
strcpy(fstr->dvread,typnam);
strcat(fstr->dvread,"read");
strcpy(fstr->dvwrite,typnam);
strcat(fstr->dvwrite,"write");
strcpy(fstr->dvcntl,typnam);
strcat(fstr->dvcntl,"control");
strcpy(fstr->dvseek,typnam);
strcat(fstr->dvseek,"seek");
strcpy(fstr->dvgetc,typnam);
strcat(fstr->dvgetc,"getc");
strcpy(fstr->dvputc,typnam);
strcat(fstr->dvputc,"putc");
fstr->dvminor = 0;
}
/* mkdev -- make a node on the device list */
mkdev(nameid, typid, deviceid)
int nameid, typid, deviceid;
{
dvptr s;
char *devn,*tn,*dn;
int found;
s = (dvptr) malloc(sizeof(struct dvtype));
s->dvnext = NIL;
if (devs == NIL) {
devs = s;
lastdv = s;
} else {
lastdv->dvnext = s;
lastdv = s;
}
ndevs++;
tn = symtab[typid].symname;
devn = symtab[nameid].symname;
if (deviceid >= 0)
dn = symtab[deviceid].symname;
else
dn = NULL;
found = 0;
for (s=ftypes ; s != NULL ; s=s->dvnext)
if (s->dvtname == tn && (dn==NULL || s->dvdevice==dn)) {
strdup(lastdv,s,sizeof(struct dvtype));
found=1;
break;
}
if (found==0) {
fprintf(stderr,
"Bad type or device name in declaration of %s on line %d\n",
devn, linectr);
exit(1);
}
lastdv->dvnext = NIL;
lastdv->dvname = devn;
}
/* chdname -- check for duplicate device name */
ckdname(devid)
int devid;
{
dvptr s;
extern dvptr devs;
char *name;
name = symtab[devid].symname;
for (s=devs; s!=NIL ; s=s->dvnext) {
if (s->dvname == name) {
fprintf(stderr,"Duplicate device name %s on line %d\n",
name,linectr);
exit(1);
}
}
return(devid);
}
strdup(tostr,fromstr,len)
char *tostr, *fromstr;
int len;
{
for( ; len > 0 ; len--)
*tostr++ = *fromstr++;
}
#line 768 "y.tab.c"
#define YYABORT goto yyabort
#define YYREJECT goto yyabort
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
int
yyparse()
{
register int yym, yyn, yystate;
#if YYDEBUG
register char *yys;
extern char *getenv();
if (yys = getenv("YYDEBUG"))
{
yyn = *yys;
if (yyn >= '0' && yyn <= '9')
yydebug = yyn - '0';
}
#endif
yynerrs = 0;
yyerrflag = 0;
yychar = YYEMPTY;
yyssp = yyss;
yyvsp = yyvs;
*yyssp = yystate = 0;
yyloop:
if (yyn = yydefred[yystate]) goto yyreduce;
if (yychar < 0)
{
if ((yychar = YYLEX) < 0) yychar = 0;
#if YYDEBUG
if (yydebug)
{
yys = 0;
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
printf("%sdebug: state %d, reading %d (%s)\n",
YYPREFIX, yystate, yychar, yys);
}
#endif
}
if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
{
#if YYDEBUG
if (yydebug)
printf("%sdebug: state %d, shifting to state %d\n",
YYPREFIX, yystate, yytable[yyn]);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
*++yyvsp = yylval;
yychar = YYEMPTY;
if (yyerrflag > 0) --yyerrflag;
goto yyloop;
}
if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
{
yyn = yytable[yyn];
goto yyreduce;
}
if (yyerrflag) goto yyinrecovery;
#ifdef lint
goto yynewerror;
#endif
yynewerror:
yyerror("syntax error");
#ifdef lint
goto yyerrlab;
#endif
yyerrlab:
++yynerrs;
yyinrecovery:
if (yyerrflag < 3)
{
yyerrflag = 3;
for (;;)
{
if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
{
#if YYDEBUG
if (yydebug)
printf("%sdebug: state %d, error recovery shifting\
to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
*++yyvsp = yylval;
goto yyloop;
}
else
{
#if YYDEBUG
if (yydebug)
printf("%sdebug: error recovery discarding state %d\n",
YYPREFIX, *yyssp);
#endif
if (yyssp <= yyss) goto yyabort;
--yyssp;
--yyvsp;
}
}
}
else
{
if (yychar == 0) goto yyabort;
#if YYDEBUG
if (yydebug)
{
yys = 0;
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
YYPREFIX, yystate, yychar, yys);
}
#endif
yychar = YYEMPTY;
goto yyloop;
}
yyreduce:
#if YYDEBUG
if (yydebug)
printf("%sdebug: state %d, reducing by rule %d (%s)\n",
YYPREFIX, yystate, yyn, yyrule[yyn]);
#endif
yym = yylen[yyn];
yyval = yyvsp[1-yym];
switch (yyn)
{
case 2:
#line 95 "config.y"
{doing = "device definitions";}
break;
case 8:
#line 106 "config.y"
{mktype(yyvsp[0]);}
break;
case 9:
#line 109 "config.y"
{yyval = currtname = cktname(yyvsp[-1]);}
break;
case 10:
#line 112 "config.y"
{yyval = currname =
lookup(yytext,yyleng);
}
break;
case 13:
#line 120 "config.y"
{newattr(CSR,yyvsp[0]);}
break;
case 14:
#line 122 "config.y"
{newattr(IVEC,yyvsp[0]);}
break;
case 15:
#line 124 "config.y"
{newattr(OVEC,yyvsp[0]);}
break;
case 16:
#line 126 "config.y"
{newattr(IRQ,yyvsp[0] +IRQBASE);}
break;
case 17:
#line 128 "config.y"
{newattr(IINT,yyvsp[0]);}
break;
case 18:
#line 130 "config.y"
{newattr(OINT,yyvsp[0]);}
break;
case 19:
#line 132 "config.y"
{newattr(OPEN,yyvsp[0]);}
break;
case 20:
#line 134 "config.y"
{newattr(CLOSE,yyvsp[0]);}
break;
case 21:
#line 136 "config.y"
{newattr(INIT,yyvsp[0]);}
break;
case 22:
#line 138 "config.y"
{newattr(GETC,yyvsp[0]);}
break;
case 23:
#line 140 "config.y"
{newattr(PUTC,yyvsp[0]);}
break;
case 24:
#line 142 "config.y"
{newattr(READ,yyvsp[0]);}
break;
case 25:
#line 144 "config.y"
{newattr(WRITE,yyvsp[0]);}
break;
case 26:
#line 146 "config.y"
{newattr(SEEK,yyvsp[0]);}
break;
case 27:
#line 148 "config.y"
{newattr(CNTL,yyvsp[0]);}
break;
case 28:
#line 151 "config.y"
{yyval = atoi(yytext,yyleng);}
break;
case 32:
#line 159 "config.y"
{mkdev(yyvsp[-3],yyvsp[-1],yyvsp[0]);}
break;
case 33:
#line 162 "config.y"
{yyval = currdname = ckdname(yyvsp[0]);}
break;
case 34:
#line 165 "config.y"
{yyval = 0;}
break;
case 35:
#line 167 "config.y"
{yyval = yyvsp[0];}
break;
#line 1007 "y.tab.c"
}
yyssp -= yym;
yystate = *yyssp;
yyvsp -= yym;
yym = yylhs[yyn];
if (yystate == 0 && yym == 0)
{
#if YYDEBUG
if (yydebug)
printf("%sdebug: after reduction, shifting from state 0 to\
state %d\n", YYPREFIX, YYFINAL);
#endif
yystate = YYFINAL;
*++yyssp = YYFINAL;
*++yyvsp = yyval;
if (yychar < 0)
{
if ((yychar = YYLEX) < 0) yychar = 0;
#if YYDEBUG
if (yydebug)
{
yys = 0;
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
printf("%sdebug: state %d, reading %d (%s)\n",
YYPREFIX, YYFINAL, yychar, yys);
}
#endif
}
if (yychar == 0) goto yyaccept;
goto yyloop;
}
if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
yystate = yytable[yyn];
else
yystate = yydgoto[yym];
#if YYDEBUG
if (yydebug)
printf("%sdebug: after reduction, shifting from state %d \
to state %d\n", YYPREFIX, *yyssp, yystate);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
goto yyoverflow;
}
*++yyssp = yystate;
*++yyvsp = yyval;
goto yyloop;
yyoverflow:
yyerror("yacc stack overflow");
yyabort:
return (1);
yyaccept:
return (0);
}
@
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -