سؤال

I'm given a parser written in Lex and Yacc which happens to be ambiguous and incomplete. When compiling, I get several shift/reduce and reduce/reduce conflicts. I cannot seem to find anything online that helps me understand what this really means and what needs to be done to fix it. I'm hoping someone here can help clear things up for me.

The parser:

%{
  #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);
}

The conflicts and warning messages:

conflicts: 11 shift/reduce, 7 reduce/reduce parser.y:30.17-26: warning: rule useless in parser due to conflicts: argumentsList: expression **parser.y:33.10-26:** warning: rule useless in parser due to conflicts: return: RETURN expression

هل كانت مفيدة؟

المحلول

The rule expression: expression is meaningingless and makes the grammar ambiguous, and also results in a parser with an infinite loop, since an argumentList will try to expand it infinitely (this is why you get the message about argumentsList: expression being useless -- it is superceded by expression: expression so can never be reduced.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top