2014-03-06 149 views
0

我給寫在LexYacc解析器這恰好是含糊和不完整的。編譯時,我會進行幾次轉換/減少並減少/減少衝突。我似乎無法在網上找到任何東西,讓我瞭解這究竟是怎樣,什麼需要做修復它。我希望這裏有人能夠幫助我解決問題。分析器移位/減少減少/減少衝突

解析器:

%{ 
    #include <stdio.h> 
    int yylex(); 
%} 

%token ID INT_CONST REAL_CONST LPAREN RPAREN INT REAL VOID COMMA LCBRAC RCBRAC ASSIGN  SEMICOLON IF ELSE ADD RETURN SUBT MULT DIV FOR UNTIL 

%%     /* beginning of rules section */ 

program : functionDeclarationS; 
functionDeclarationS : functionDeclaration | functionDeclaration functionDeclarationS; 
functionDeclaration : typeSpecifier ID LPAREN params RPAREN functionBody; 
typeSpecifier : INT | VOID; 
params : paramList | VOID; 
paramList : param COMMA paramList | param; 
param : typeSpecifier ID; 
functionBody : LCBRAC localDeclarations statementS RCBRAC; 
localDeclarations : varDeclarations SEMICOLON localDeclarations | ; 
varDeclarations : INT varList; 
varList : ID | ID COMMA varList; 
statementS : statement statementS | ; 
statement : assignment SEMICOLON | expression SEMICOLON | ifStmt | return SEMICOLON; 
assignment : ID ASSIGN expression; 
expression : expression ADD expression | LPAREN expression RPAREN | expression; 
expression : integer | real | ID | functionCall; 
integer : sign INT_CONST; 
real : sign REAL_CONST; 
sign : ADD | SUBT| ; 
functionCall : ID LPAREN argumentsList RPAREN; 
argumentsList : expression | expression COMMA argumentsList | ; 
ifStmt : IF LPAREN expression RPAREN block; 
block : LCBRAC statementS RCBRAC; 
return : RETURN expression ; 

%% 
int main() 
{ 
    return(yyparse()); 
} 

yyerror(s) 
char *s; 
{ 
    fprintf(stderr, "%s\n",s); 
} 

int yywrap() 
{ 
    return(1); 
} 

的衝突和警告消息:

衝突:11 shift/reduce7 reduce/reduce parser.y:30.17-26:警告:解析器規則無用由於衝突:argumentsList:表達 **parser.y:33.10-26:**警告:規則解析器無用由於衝突:收益:表達

+0

使用'-v'標誌到yacc產生一個y.output文件,詳細描述所有的狀態和衝突...... –

+0

的[上移減少解析維基百科頁面(http://en.wikipedia.org/wiki/Shift-reduce_parser)有很多有用的信息和鏈接瞭解LR看齊一般唱狀態和衝突 –

回答

1

規則expression: expression是meaningingless,使語法歧義,同時也產生了具有無限循環解析器,因爲一個參數列表會嘗試將其展開無限(這就是爲什麼你得到有關argumentsList: expression無用的消息 - 它被expression: expression取代,所以永遠不能被減少。)