フレックス定義:
"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 関数を呼び出して警告するように設定しましたが、bison は yyerror 自体を呼び出します。その出力は、「zhouzhou:1.3-1.6:syntax error, unexpected CELL, expected EDIF」です。実際には、「zhouzhou:1.3-1.6: warnning: the component name is a keyword」となります。bison を yyerror と呼ばないようにする方法は?