这是我的代码的一小部分,我收到错误说
对会员'的要求不是结构或工会。
我有这个错误,因为我不再需要使用s,因为我指定了他的类型。我遇到的问题是,我需要另一种方式来改造那个'而不是$ 3.s,我找不到怎么做。如果我只花3美元,我不会在'$ 3.s [0]'时收到错误,但我会在'strcpy($ 3.s,$ 3.s + 1)'时收到错误 我是lex& yacc的新手,直到现在我所知道的事情都无法帮助我解决这个问题。
%union{
int i;
char *s;
}
%left '+','-'
%left '*','/'
%left UNARYMINUS
%type <i> expr
%type <s> instr
%token <i> NUMBER
%token <s> WORD
%token <s> SPACE
%%
instr: SPACE instr { }
|WORD '=' expr ';' {
int v;
if ($3.s[0]=='$')
{
fprintf(fout, "\tmove\t$%d, %s\n\n", variabile($1.s), $3.s);
strcpy($3.s, $3.s+1);
v=atoi($3.s);
if (v>nvar)
erasereg(v);
}
else
fprintf(fout, "\taddi\t$%d, $0, %s\n\n", variabila($1.s), $3.s);
free($1.s);
free($3.s);
}
;
答案 0 :(得分:1)
使用%type <i> expr
,您告诉Yacc expr
是一个整数,但您仍然会检查它是否指向$
。它是一个或另一个。您可以:
instr
的块中
将$variables
与lex规则匹配,并在符号表中查找
"$"[A-Za-z][A-Za-z0-9]* { return var_lookup(yytext); }
或者您可以在expr
expr: WORD {
$$ = $1[0]=='$' ? var_lookup($1) : atoi($1);
}
此外,%left
的参数由空格分隔,而不是逗号,并且您不会调用非函数指针,您可以使用/取消引用它们。