野牛如何调用%union中声明的指针

时间:2016-06-25 12:11:54

标签: c bison yacc lex

这是我的代码的一小部分,我收到错误说

  

对会员'的要求不是结构或工会。

我有这个错误,因为我不再需要使用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);
                            }
       ;

1 个答案:

答案 0 :(得分:1)

使用%type <i> expr,您告诉Yacc expr是一个整数,但您仍然会检查它是否指向$。它是一个或另一个。您可以:

,而不是尝试将所有功能塞入解析instr的块中
  • $variables与lex规则匹配,并在符号表中查找

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

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

此外,%left的参数由空格分隔,而不是逗号,并且您不会调用非函数指针,您可以使用/取消引用它们。