Bison yacc中结构的正确使用
请帮忙!我是一个新手,我正试图用flex bison编写一个解析器,我被要求使用一个记录类型,我不知道为什么在我尝试使用它的时候,第一次和第二次使用它,我猜是类型happendi中的冲突,它给了我这个错误列表 这是文件global.hBison 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个段,这就是要解析的文本类
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文件中有两个错误。你都发现了吗?请澄清。