弹性定义:
"view" { return VIEW;}
"cell" { return CELL;}
[A-Za-z]+ {
yylval.strval=strdup(yytext);
return ALPHA;
}
[()] {return yytext[0];}
我的野牛语法:
static int len=10;
static char *allkeywords[10]= {"view","acload","actual","after","alpha","and","annotate","apply","arc","array" };
cell:’(’ CELL ALPHA ’)’ { goal=$3;
flag=binary_search(allkeywords,len,goal);
if(flag)
{
yyerror("warnning: the component name is a keyword");
yyclearin;
yyerrok;
}
;
int binary_search(const char *a[10], int len, char *goal)
{
int low = 0;
int high = len - 1;
while(low <= high)
{
int middle = (low + high)/2;
if(strcmp (goal,a[middle])==0 )
return 1;
else if(strcmp (goal,a[middle]) < 0)
high = middle - 1;
else
low = middle + 1;
}
return 0;
}
我的指示:
bison -d -v bison.y
flex flex.l
gcc bison.tab.c lex.yy.c
比如输入流是(cell view),单词“view”是用户给的随机字母组合。巧合的是,它是EDIF文件的关键字,也对应ALPHA。我设置如果用户给出的ALPHA是关键字,调用yyerror函数进行警告,但野牛调用yyerror本身。它的输出是“zhouzhou:1.3-1.6:syntax error, unexpected CELL, expecting EDIF”,实际上,我希望它存在“zhouzhou:1.3-1.6: warnning: the component name is a keyword”。如何让野牛不叫它 yyerror ,按我的意思做?