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:**
경고 : 파서 쓸모없는 규칙으로 인해 충돌 에 : 반환 : RETURN 표현
모든 상태를 자세히 설명하는 y.output 파일을 생성하려면 yacc에'-v' 플래그를 사용하십시오 갈등은 ... –
[shift-reduce 구문 분석에 대한 위키 백과 페이지] (http://en.wikipedia.org/wiki/Shift-reduce_parser)에는 LR 파를 이해하는 데 유용한 정보와 링크가 많이 있습니다. 일반적으로 국가와 갈등을 불러 일으킨다. –