2014-04-25 5 views
0

나는 lex 및 yacc 프로그래밍과이 yacc 프로그램을 사용하여 10 개의 시프트/감소 충돌을 제공하는 산술 표현식의 유효성을 검사하고 평가합니다. 이 프로그램 무슨 잘못을 지적 할 수yacc의 시프트/줄이기

이 내가이

lex 611.l 

yacc -d 611.y 
같은 코드를 complie 할 때이 611.l

%{ 
#include "y.tab.h" 
#include<stdio.h> 
#include<ctype.h> 
extern int yylval; 
int val; 
%} 

%% 

[a-zA-Z][a-zA-Z0-9]* {printf("\n enter the value of variable %s:",yytext);scanf("%d",&val);yylval=val;return id;} 
[0-9]+[.]?[0-9]* {yylval=atoi(yytext);return num;} 
[ \t] ; 
\n {return 0;} 
. {return yytext[0];} 
%% 

int yywrap() 
{ 
    return 1; 
} 

입니다 611.y

%{ 
#include<stdio.h> 
int flag=1; 
%} 

%token id num 
%left '(' ')' 
%left '+' '-' 
%left '/' '*' 
%nonassoc UMINUS 

%% 

stmt: 
    expression { printf("\n valid exprn");} 
    ; 

expression: 
    '(' expression ')' 
    | '(' expression {printf("\n Syntax error: Missing right paranthesis");} 
    | expression '+' expression {printf("\nplus recog!");$$=$1+$3;printf("\n %d",$$);} 
    | expression '+' { printf ("\n Syntax error: Right operand is missing ");} 
    | expression '-' expression {printf("\nminus recog!");$$=$1-$3;printf("\n %d",$$);} 
    | expression '-' { printf ("\n Syntax error: Right operand is missing ");} 
    | expression '*' expression {printf("\nMul recog!");$$=$1*$3;printf("\n %d",$$);} 
    | expression '*' { printf ("\n Syntax error: Right operand is missing ");} 
    | expression '/' expression {printf("\ndivision recog!");if($3==0) printf("\ndivision cant be done, as divisor is zero.");else {$$=$1+$3;printf("\n %d",$$);}} 
    | expression '/' { printf ("\n Syntax error: Right operand is missing ");} 
    | expression '%' expression 
    | expression '%' { printf ("\n Syntax error: Right operand is missing ");} 
    | id 
    | num 
; 

%% 

main() 
{ 
    printf(" Enter an arithmetic expression\n"); 
    yyparse(); 
} 

yyerror() 
{ 
    printf(" Invalid arithmetic Expression\n"); 
    exit(1); 
} 

입니다

나에게 준다

yacc:10 shift/reduce conflicts. 

여기서 도와주세요.

답변

3

두 가지 잘못된 :

  1. '%'의 우선 순위는 '(' expression 오류 처리기가 모호 '/' '*'
  2. 에 추가 누락 및 (식 (4*(2+3)+5*7에서 누락 된 괄호를 삽입하는 방법에는 여러 가지가 있습니다) 실제로 정상적인 '(' expression ')' 규칙과 충돌합니다. 이러한 핸들러를 작동시키는 것은 사소한 일입니다. 내가 그것을 제거하고 내장 yacc 오류 처리기에 의존하는 것이 좋습니다 것입니다.

간단한 오류 처리는 다음과 같이 구현할 수 있습니다 : 당신은 너무 다른 모든 오류 처리기를 필요가 없습니다

stmt: 
    expression { printf("\n valid exprn");} 
    | error { printf(" Invalid arithmetic Expression\n"); } 
    ; 

expression: 
    '(' expression ')' 
    | '(' error ')' { printf(" Invalid arithmetic Expression\n"); } 
    | ... /* all the rest */ 

.

+0

와우 .. 당신은 훌륭합니다! 매력처럼 작동했습니다. –