Flex/Bison错误:请求成员'str';在非结构或联盟中

Flex/Bison错误:请求成员'str';在非结构或联盟中,bison,flex-lexer,Bison,Flex Lexer,我正在学习flex/bison。我写了下面的程序,但出现了错误 %{ #include <stdio.h> typedef struct node { struct node *left; struct node *right; char *token; }node; node *mknode( node *left, node *right, char *token); void printtree(node *tree); #define YYST

我正在学习flex/bison。我写了下面的程序,但出现了错误

%{
#include <stdio.h>

typedef struct node
{
    struct node *left;
    struct node *right;
    char *token;

}node;

node *mknode( node *left, node *right, char *token);
void printtree(node *tree);

#define YYSTYPE struct node *

%}


%union 
{
    char* str;
    int num;
}


%start  lines
%token <str> WORD 
%token <str> PLUS MINUS TIMES DIVIDE    POWER
%token <str> LEFT_PARENTHESIS RIGHT_PARENTHESIS
%token  <str> END

%left PLUS MINUS
%left TIMES DIVIDE
%right POWER

%type <str> exp term factor line lines
%%

lines:      /* empty */
            | lines line;

line:       exp END                 { printtree($1); printf("\n");}
            ;

exp:        term                    {$$=$1; }
            | exp PLUS term         { $$=mknode($1,$3,"+"); }
            | exp MINUS term        { $$=mknode($1,$3,"-"); }
            ;

term:       factor                  { $$=$1; }
            |term TIMES factor      { $$=mknode($1,$3,"*"); }
            ;

factor:     WORD                    { $$=mknode(0,0, (char*)yylval); }
            |LEFT_PARENTHESIS exp RIGHT_PARENTHESIS 
                                    { $$=$2; }
            ;
%%

int main(void)
{
    return yyparse();
}

node *mknode(node *left, node *right, char *token)
{
  /* malloc the node */
  node *newnode = (node *)malloc(sizeof(node));
  char *newstr = (char *)malloc(strlen(token)+1);
  strcpy(newstr, token);
  newnode->left = left;
  newnode->right = right;
  newnode->token = newstr;
  return(newnode);
}

void printtree(node *tree)
{
  int i;

  if (tree->left || tree->right)
    printf("(");

  printf(" %s ", tree->token);

  if (tree->left)
    printtree(tree->left);
  if (tree->right)
    printtree(tree->right);

  if (tree->left || tree->right)
    printf(")");
}

int yyerror(char *s )
{
    fprintf (stderr, "%s\n", s);
}

你知道我为什么会出现这个错误吗?

第一个明显的问题是,如果你使用的是yacc,你不应该定义
YYSTYPE
。Yacc从您的
%union
定义
YYSTYPE
。如果使用的是
lex
,而不是
yacc
,则需要定义
YYSTYPE

您的
%union
解析堆栈项类型仅包含
int
str
成员。示例:您已将
exp
语法符号定义为具有类型
str
,然后您有了以下结果:

exp:        term                    {$$=$1; }
            | exp PLUS term         { $$=mknode($1,$3,"+"); }
            | exp MINUS term        { $$=mknode($1,$3,"-"); }
            ;
mknode
函数返回
node*
,但是
$$
符号的类型是
char*
,因为它代表左侧的
exp
,您将其输入为
str
,而
%union
str
成员是
char*


mknode
的参数也必须是
node*
。但是,
$1
$3
没有这种类型。

标签实际上是用于Adobe Flash交易的。虽然flex不是GNU项目,但标签是我们一直坚持的。也许Adobe Flash类别也应该将其标签更改为Adobe-flex。flex和bison是GNU项目的
lex
yacc
的实现。它们具有在其他
lex
yacc
工具中找不到的特殊功能,但这在这里并不是很相关。你是如何解决MinGW上的Flex编译问题的?我没有看到回应。你能推荐一个学习flex和bison的好网站吗。非常感谢。我建议您阅读这些程序的手册;文档非常好。另外,
yacc
lex
由单一的Unix规范标准化:这为便携式工具(而不是GNU扩展)提供了完整的规范;Flex手册:
exp:        term                    {$$=$1; }
            | exp PLUS term         { $$=mknode($1,$3,"+"); }
            | exp MINUS term        { $$=mknode($1,$3,"-"); }
            ;