Include struct in the %union def with Bison/Yacc

笑着哭i 提交于 2019-11-27 20:37:19

Even better, use the %code directive with the "requires" option, i.e.:

%code requires {
    struct node {
        char * val;
        struct node * next;
    };
}

%union {
    char * string;
    struct node args;
}

This will include the code in the "requires" block in the tab.h file as well as the parser source file.

From the documentation: http://www.gnu.org/software/bison/manual/html_node/Decl-Summary.html#Decl-Summary

  • requires
    • Purpose: This is the best place to write dependency code required for YYSTYPE and YYLTYPE. In other words, it's the best place to define types referenced in %union directives, and it's the best place to override Bison's default YYSTYPE and YYLTYPE definitions.

It comes down to the lame y.tab.h output you get.

You need to fix this by ensuring that "struct node" is defined before you include y.tab.h anywhere.

To do this create a file node.h with the struct definition.

Then include node.h before y.tab.h in your parser.l file, parser.y file as well as any c files you have which include y.tab.h. This is a little annoying.

Alternatively you could change "struct node args" to "struct node* args" since you would not need to know the full type until you go to use it somewhere. Not sure if this would fit with your code.

Either one should work.

Maybe simpler (I think) - used this myself:

%union {
  char   c; 
  struct {
     char name[30];
     int  type;
  } s;
}

Then, in flex you can use "yylval.s.name" , or "yylval.s.type", etc.. while in bison, instead of $$=0, $1=bla... you can now write $<s.type>$=0 , $<s.type>1=bla...

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!