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

bison how to call pointer declared in %union

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

request for member 's' is something not a structure or a union.

我有这个错误是因为我不再需要使用 s,因为我指定了他的类型。我遇到的问题是,我需要另一种方法来引用 's',而不是 $3.s,但我找不到该怎么做。如果我只投入 3 美元,我将不会在“$3.s[0]”处收到错误消息,但会在 'strcpy(.s, .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 (.s[0]=='$')
                              {
                                fprintf(fout, "\tmove\t$%d, %s\n\n", variabile(.s), .s);
                                strcpy(.s, .s+1);
                                v=atoi(.s);
                                if (v>nvar)
                                  erasereg(v);
                              }
                              else
                                fprintf(fout, "\taddi\t$%d, [=10=], %s\n\n", variabila(.s), .s);
                              free(.s);
                              free(.s);
                            }
       ;

使用 %type <i> expr,你告诉 Yacc expr 是一个整数,但你仍然检查它是否指向 $。它是一个或另一个。与其尝试将所有功能塞入解析 instr 的块中,不如:

  • $variables 与 lex 规则匹配并在符号 table 中查找

    "$"[A-Za-z][A-Za-z0-9]* { return var_lookup(yytext); }
    
  • 或者您可以在 expr

    的 yacc 规则中查找它们
    expr: WORD {
          $$ = [0]=='$' ? var_lookup() : atoi();
    }
    

此外,%left 的参数由空格而不是逗号分隔,并且您不调用非函数指针,您 use/dereference 它们。