对于输入abb
,接受了答案,但为什么?
输入ab
正确答案
输入aab
拒绝正确回答
输入aabb
接受正确答案
// parser file
%{
#include<stdio.h>
%}
%left '-' '+'
%left '*' '/'
%%
A: S { printf("accepted\n"); exit(1);}
| error
|
;
S : 'a' S 'b'
| 'a' 'b'
|
;
%%
void yyerror(char *s)
{
printf("%s",s);
exit(1);
}
int main()
{
yyparse();
return 1;
}
// lex file
%option noyywrap
%{
#include "first.tab.h"
%}
%%
[a-b] {yylval=(atoi(yytext));
return *yytext;}
\+|\-|\/|\* {return *yytext;}
. { yyerror("Invalid Character");}
\n { return 1;}
%%
答案 0 :(得分:1)
我假设您的问题是解析器接受输入 abb 的原因,当语法似乎描述了一个输入时,首先是 a ,然后是相同数量的 b ?
Bison生成的解析器不必解析 all 输入,只要它与语法匹配就足够了。例如, aaabbbcde 由三个 a 组成,后跟相同数量的 b ,然后解析器很高兴并打印“公认”。最后有一些垃圾( cde ),但解析器已经完成,并不关心。因此 ab 被接受,因为 ab 是有效输入。
另一方面aab 不被接受,因为它以两个 a 开头,但解析器只找到一个 b
您的语法中也存在移位/减少冲突和减少/减少冲突,这意味着有时可以以多种方式解析相同的输入。这使事情变得更加复杂,你应该解决这些冲突。