这个yacc文件有什么问题?

时间:2011-01-05 15:46:05

标签: c syntax-error yacc

我在以下代码中收到此错误 tema4.y:13.19-26:语法错误,意外的typetype ,请帮帮我!

%{
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
%}
%union {
int intval;
char* strval;
char* charval;
}
%token <charval>SHR <intval>NR
%token CMP
%type <strval>str <intval>expr
%nonassoc CMP '|'   
%left '+' '-'
%left '*' '`' '#'

%start s
%%
s:str {printf("%s \n",$<strval>$);}
 | expr {printf("%s \n",$<intval>$)}
 ;
str : str '+' str {
                   char* s=malloc(strlen($1)+strlen($3)+1);
                   strcpy(s,$1);
                   strcat(s,$3);
                   $$=s;
                   }
    | str '-' str {
                   char *s=malloc(strlen($1));
                   char *sir=malloc(strlen($1)-strlen($3));
                   char *pt,*ps;
                   int i;
                   strcpy(s,$1);
                   pt=strstr(s,$3);   
                   if(pt) {
                           ps=pt+strlen($3);
                           strncpy(pt,ps,strlen(ps)); 
                           ps+=strlen(ps);
                           strncpy(sir,s,strlen($1)-strlen($3));
                          }
                  $$=sir;
                  }
    | str '*' NR {
                   int i;
                   char* s=malloc(strlen($1)*NR+1);
                   for(i=0;i<$3;i++)
                   {
                      strcat(s,$1);
                   }
                   $$=s;
                 }
    | str '#' NR {
                   char *s=malloc($3+1);
                   strcpy(s,$1);
                   if($3>strlen($1)) {printf("Nr prea mare\n");exit(1);}
                   else {s=s+strlen(s)-$3;
                        $$=s;}
                 }
    | NR '`' str {
                  char *s=malloc($1+1); 
                  strncpy(s,$3,$1);
                  $$=s;
                 }

    | '(' str ')' {
                  $$=$2;
                  }
    | SHR {
         char* s=malloc(strlen($1));
         strcpy(s,$1);
         $$=s;
         }
    | expr
    ;
expr : str CMP str {
                  if(strcmp($1,$3)) $$=0;
                  else $$=1;
                  }
    | '|' str '|' {
                  $$=strlen($2);
                  }
 ;
%%
int main(){
   yyparse();
}

2 个答案:

答案 0 :(得分:2)

我可以告诉您,<type>%token声明中只能有一个%type。您可以拥有多个令牌或非终端,但只能使用一个类型名称。尝试拆分这些行:

%token <charval> SHR
%token <intval> NR
%token CMP
%type <strval> str
%type <intval> expr

答案 1 :(得分:2)

John有第一个错误的答案 - %type%token声明中只有一种类型。对于第二个错误(类型冲突),问题是您的规则str: expr ; - str是<strval>而expr是<intval>,因此默认操作({ $$ = $1; }有效)有类型冲突。

您还可以在某处进行减少/减少冲突 - 您需要使用-d运行yacc并查看生成的y.output文件,以获取有关冲突的详细信息。