Bison yacc中结构的正确使用

Bison yacc中结构的正确使用,bison,flex-lexer,yacc,lex,Bison,Flex Lexer,Yacc,Lex,请帮忙!我是一个新手,我正试图用flex bison编写一个解析器,我被要求使用一个记录类型,我不知道为什么在我尝试使用它的时候,第一次和第二次使用它,我猜是类型happendi中的冲突,它给了我这个错误列表 这是文件global.h struct Point{ int *x; int *y; }; typedef struct Point Point; #define YYSTYPE Point extern YYSTYPE yylval; 知道一个图形可能有3到4个段,这就是要解析的文本类

请帮忙!我是一个新手,我正试图用flex bison编写一个解析器,我被要求使用一个记录类型,我不知道为什么在我尝试使用它的时候,第一次和第二次使用它,我猜是类型happendi中的冲突,它给了我这个错误列表

这是文件global.h

struct Point{
int *x;
int *y;
};
typedef struct Point Point;
#define YYSTYPE Point
extern YYSTYPE yylval;
知道一个图形可能有3到4个段,这就是要解析的文本类型

 Figure{
 Segment{
 Point(1,30)
 Point(20,30)
 }
 Segment{
 Point(20,30)
 Point(2,10)
 }
 Segment{
 Point(2,10)
 Point(1,30)
 }
 }
这就是我试图做的

我的代币

%{
#include <stdio.h>
#include <string.h>
#include "global.h"
#include "y.tab.h"
extern YYSTYPE yylval;
struct Point *tmp;
%}
%option noyywrap
blanks         [ \t\n]+
accolade_close      \}
comma                        \,
number          [0-9]+
%x ABS ORD
%%
{blanks}        { /* ignore */ }
"Point(" {BEGIN(ABS);}
<ABS>{number} { 
tmp= (struct Point*) malloc(sizeof(struct Point));
tmp->x=atoi(yytext); }
<ABS>{comma} {BEGIN(ORD); }
<ORD>{number} { 
tmp->y=atoi(yytext);
//yylval= ( Point *) malloc(sizeof(Point)); 
yylval.x= tmp->x;
yylval.y= tmp->y;
return POINT;
}
<ORD>\) { BEGIN(INITIAL);}
"Figure{" { return(FIGURE); }
"Segment{"   { return(SEGMENT); }
{accolade_close}    { return(ACCOLADE_CLOSE); }
.    { yyerror("Unknown char");  }
%%
%{
#包括
#包括
#包括“global.h”
#包括“y.tab.h”
外部的YYSTYPE yylval;
结构点*tmp;
%}
%选项No yywrap
空白[\t\n]+
嘉奖_close\}
逗号\,
编号[0-9]+
%x ABS ORD
%%
{blanks}{/*忽略*/}
点({BEGIN(ABS);}
{number}{
tmp=(结构点*)malloc(sizeof(结构点));
tmp->x=atoi(yytext);}
{逗号}{开始(ORD);}
{number}{
tmp->y=atoi(yytext);
//yylval=(点*)malloc(sizeof(点));
yylval.x=tmp->x;
yylval.y=tmp->y;
返回点;
}
\){开始(首字母);}
“图{{返回(图);}”
“段{{返回(段);}”
{Acclade_close}{返回(Acclade_close);}
.{yyerror(“未知字符”);}
%%
图y

   %{
#include "global.h"
#include "y.tab.h"
#include <stdio.h>
#include<stdlib.h>
int yyparse();
int yylex();
int yyerror(char *s);
%}
%union {
struct Point *point;
 }
%token <Point> FIGURE SEGMENT POINT ACCOLADE_CLOSE 
%start Input
%%
Input:FIGURE ListSegment ACCOLADE_CLOSE 
 ;
ListSegment: Seg Seg Seg Seg
       | Seg Seg Seg
       ;
 Seg: SEGMENT POINT POINT ACCOLADE_CLOSE { printf("Segment Point1 
 (%d,%d)\n",$2->x, $2->y);}

 %%

int yyerror(char *s) {
printf("yyerror : %s\n ",s);
return 0;
}

int main(void) {
yyparse();
return 0;
}
%{
#包括“global.h”
#包括“y.tab.h”
#包括
#包括
int-yyparse();
int-yylex();
int yyerror(字符*s);
%}
%联合{
结构点*点;
}
%标志性数字段点荣誉关闭
%开始输入
%%
输入:图ListSegment Acclaude_CLOSE
;
ListSegment:Seg Seg Seg Seg
|赛格赛格赛格
;
Seg:段点荣誉闭合{printf(“段点1
(%d,%d)\n“,$2->x,$2->y);}
%%
int yyerror(字符*s){
printf(“YY错误:%s\n”,s);
返回0;
}
内部主(空){
yyparse();
返回0;
}

按照您的定义,
yylval
是一个
。没有
成员。请下定决心


正常的做法是将
yyunion
定义为具有
成员,该成员与.y文件中的代码一致。

很抱歉,这对我来说是全新的,我现在做了一些修改,错误没有成员了,但警告仍然存在,当我取下
printf
语句时,它起了作用,当我把它加回来并尝试用不同的表格来显示它$2->x$2.x$$2时,如果不显示你做了什么,告诉我们这一切是没有用的。请不要把它作为评论发布。
$2
是一个
yyunion
,而不是
yunion*
,因此
$2->x
应该是
$2.x
,类似地,就像图片中的那样对于printf行和tmp->x=atoi(yytext),上面是真的;在lex文件中有两个错误。你都发现了吗?请澄清。