2016-11-10 23 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

非常感謝你..現在它工作。 –