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

标签 c bison yacc lex

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

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/

相关文章:

c - 使用 RDTSC 访问内存中的 ARRAY 时在 C 中出现意外输出

c - 为什么 Bison 只打印输入?

c - 如何找到子串

java - 使用java创建解释器的工具

c - 在 linux 内核中添加了一个新的网络协议(protocol)

c - 在自定义内核中打开/关闭 PS/2 键盘 Caps Lock LED

更改 7 段计数器显示

c - 弹性/Bison : segmentation fault core dump

php - PHP 中的 Lex 和 Yacc

python - 如何使用 PLY (Python Lex-Yacc) 丢弃语法文件中的非终结符