这是我的代码的一小部分,我收到一条错误消息
request for member 's' is something not a structure or a union.
我有这个错误是因为我不再需要使用 s,因为我指定了他的类型。我遇到的问题是,我需要另一种方式来引用 '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);
}
;
最佳答案
与 %type <i> expr
,你告诉 Yacc expr
是一个整数,但你仍然检查它是否指向 $
。要么是其中之一,要么是另一个。而不是试图将所有功能塞进解析 instr
的 block 中,你可以:
匹配
$variables
使用 lex 规则并在符号表中查找"$"[A-Za-z][A-Za-z0-9]* { return var_lookup(yytext); }
或者您可以在 yacc 规则中查找
expr
expr: WORD { $$ = $1[0]=='$' ? var_lookup($1) : atoi($1); }
另外,%left
的参数用空格而不是逗号分隔,并且您不调用非函数指针,而是使用/取消引用它们。
关于c - bison如何调用%union中声明的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38028406/