2016-11-10 47 views
0

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

我想你的问题是,为什么解析器接受输入ABB,当语法似乎描述了一个输入的第一个数字a的,然后等于b的?

野牛生成的解析器不必分析全部的输入,只是足以使其与语法相匹配。例如,aaabbbcde由三个a's组成,后面跟着相同数量的b's,然后解析器很高兴并打印出“accepted”。最后有一些垃圾(cde),但解析器已经完成,并不在意。所以abb被接受,因为ab是一个有效的输入。在另一方面

AAB不被接受,因为它具有两个一个的启动,但然后解析器只找到一个b

您的语法中也存在shift/reduce冲突和reduce/reduce冲突,这意味着相同的输入有时可能以多种方式进行分析。这使事情进一步复杂化,你应该解决这些冲突。

+0

谢谢你的回答。如果我想让abb不应该被接受。我应该怎么做 –

+0

检查输入的结束。也就是说,不要让你的解析器寻找** a b **,而是** a b DONE **。 –

+0

非常感谢你..现在它工作。 –