理解解析器接受输入的原因

时间:2016-11-10 05:04:20

标签: bison flex-lexer

对于输入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;}
%%

1 个答案:

答案 0 :(得分:1)

我假设您的问题是解析器接受输入 abb 的原因,当语法似乎描述了一个输入时,首先是 a ,然后是相同数量的 b

Bison生成的解析器不必解析 all 输入,只要它与语法匹配就足够了。例如, aaabbbcde 由三个 a 组成,后跟相同数量的 b ,然后解析器很高兴并打印“公认”。最后有一些垃圾( cde ),但解析器已经完成,并不关心。因此 ab 被接受,因为 ab 是有效输入。

另一方面

aab 不被接受,因为它以两个 a 开头,但解析器只找到一个 b

您的语法中也存在移位/减少冲突和减少/减少冲突,这意味着有时可以以多种方式解析相同的输入。这使事情变得更加复杂,你应该解决这些冲突。