2014-03-06 3 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/reduce, 7 reduce/reduce parser.y:30.17-26:경고 : 파서 ​​규칙 쓸모 인해 충돌 : argumentsList : 표현 **parser.y:33.10-26:**경고 : 파서 ​​쓸모없는 규칙으로 인해 충돌 에 : 반환 : RETURN 표현

+0

모든 상태를 자세히 설명하는 y.output 파일을 생성하려면 yacc에'-v' 플래그를 사용하십시오 갈등은 ... –

+0

[shift-reduce 구문 분석에 대한 위키 백과 페이지] (http://en.wikipedia.org/wiki/Shift-reduce_parser)에는 LR 파를 이해하는 데 유용한 정보와 링크가 많이 있습니다. 일반적으로 국가와 갈등을 불러 일으킨다. –

답변

1

규칙 expression: expression이 meaningingless과 문법이 모호하게하고, ArgumentList라는 그것을 확장하려고하기 때문에 또한, 무한 루프 파서 결과 무한히 (이 이유는 당신이 쓸데없는 argumentsList: expression에 대한 메시지를 얻는 이유입니다. - expression: expression으로 대체됩니다.)

관련 문제