2015-03-19 72 views
0

这是我的代码calc.y.我不断收到错误: YACC:1规则从未减少 YACC:3降低/减少冲突YACC规则没有减少

真的不知道这意味着什么

香港专业教育学院做了其它地方的研究,但我现在丢失。我猜所涉及的规则是程序和声明,但即使如此......减少规则意味着什么?

%{ 
    #include <stdio.h> 
    FILE *outfile; 
    int yyline = 1; 
    int yycolumn = 1; 
%} 

%union{ 
    int nw; 
    struct{ 
    int v; 
    char s[1000]; 
    }attr; 
} 

%token SEMInumber 
%token LPARENnumber 
%token <nw> ICONSTnumber 
%token BEGINnumber 
%token PROGRAMnumber 
%token MINUSnumber 
%token TIMESnumber 
%token <nw> VARnumber 
%token INTnumber 
%token EOFnumber 
%token COMMAnumber 
%token RPARENnumber 
%token <nw>IDnumber 
%token ENDnumber 
%token ISnumber 
%token PLUSnumber 
%token DIVnumber 
%token PRINTnumber 
%token EQnumber 

%type <attr> exp 
%type <attr> term 
%type <attr> factor 
%% 


program: PROGRAMnumber IDnumber ISnumber compstate 
     ; 

compstate: BEGINnumber {print_header();} statement ENDnumber{print_end();} 
      | BEGINnumber {print_header();} statement SEMInumber statement ENDnumber{print_end();} 
      ; 

statement: IDnumber EQnumber exp 
      | PRINTnumber exp 
| declaration 
      ; 

declaration: VARnumber IDnumber 
      | VARnumber IDnumber COMMAnumber IDnumber 
      ; 

exp: term {$$.v = $1.v; strcpy($$.s, $1.s);} 
    | exp PLUSnumber term {$$.v = $1.v + $3.v; sprintf($$.s, "(%s) + (%s)", $1. s, $3.s);} 
    | exp MINUSnumber term {$$.v = $1.v - $3.v; sprintf($$.s, "(%s) - (%s)", $1. s, $3.s);} 
    ; 

term: factor {$$.v = $1.v; strcpy($$.s, $1.s);} 
     | term TIMESnumber factor {$$.v = $1.v * $3.v; sprintf($$.s, "(%s) * (%s)", $1.s, $3.s);} 
     | term DIVnumber factor {$$.v = $1.v/$3.v; sprintf($$.s, "(%s)/(%s)", $1.s, $3.s);} 
     ; 

factor: ICONSTnumber {$$.v = $1; sprintf($$.s, "%d", $1);} 
      | IDnumber {$$.v = $1.v; strcpy($$.s, $1.s);} 
      | LPARENnumber exp RPARENnumber {$$.v = $2.v; strcpy($$.s, $2.s);} 
; 


%% 


int main() 
{ 
    if(!yyparse()) 
    { 
     printf("accept\n"); 
    } 
    else 
    printf("reject\n"); 
} 

void print_header() {} 
void print_end(){} 

void yyerror(const char *str) 
{ 
    printf("yyerror: %s at line %d\n", str, yyline); 
} 

回答

-1

信息性消息 %S:%d规则从不降低
有些规则从不使用,或者是因为它们没有在语法中使用,或者因为它们是 上移的丢失端/减少或减少/减少冲突。请更改 语法以使用规则或将其删除。

+0

这是John Levine,Tony Mason和Doug Brown(第275页)的“Lex和Yacc”的直接引用。我认为这不足以成为侵犯版权的行为,但你至少应该给予信任。 – rici 2015-03-19 01:45:46

2

当compstate转换BEGINnumber标记时,中间规则操作{print_header();}的两个内部规则可能会减少,从而导致R/R冲突。 YOUE可替代

compstate: BEGINnumber {print_header();} statement ENDnumber{print_end();} 
      | BEGINnumber {print_header();} statement SEMInumber statement 
ENDnumber{print_end();} 
      ; 

用,例如

begin_number: 
    BEGINnumber { print_header(); } 

compstate: begin_number statement ENDnumber{print_end();} 
      | begin_number statement SEMInumber statement 
ENDnumber{print_end();} 
      ; 

来解决冲突。

+0

我只想说我已经在这个问题上工作了好几个小时了,我试了你的答案,并立即修复它。谢谢! – TheDetective 2017-11-24 02:31:30