gpt4 book ai didi

c - bison如何调用%union中声明的指针

转载 作者:行者123 更新时间:2023-11-30 15:07:42 25 4
gpt4 key购买 nike

这是我的代码的一小部分,我收到一条错误消息

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com