0
我給寫在Lex
和Yacc
解析器這恰好是含糊和不完整的。編譯時,我會進行幾次轉換/減少並減少/減少衝突。我似乎無法在網上找到任何東西,讓我瞭解這究竟是怎樣,什麼需要做修復它。我希望這裏有人能夠幫助我解決問題。分析器移位/減少減少/減少衝突
解析器:
%{
#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/reduce
,7 reduce/reduce
parser.y:30.17-26:
警告:解析器規則無用由於衝突:argumentsList:表達 **parser.y:33.10-26:**
警告:規則解析器無用由於衝突:收益:表達
使用'-v'標誌到yacc產生一個y.output文件,詳細描述所有的狀態和衝突...... –
的[上移減少解析維基百科頁面(http://en.wikipedia.org/wiki/Shift-reduce_parser)有很多有用的信息和鏈接瞭解LR看齊一般唱狀態和衝突 –