我在以下代码中收到此错误 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();
}
答案 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文件,以获取有关冲突的详细信息。