Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bison 请求非结构或联盟中的成员_Bison_Flex Lexer - Fatal编程技术网

Bison 请求非结构或联盟中的成员

Bison 请求非结构或联盟中的成员,bison,flex-lexer,Bison,Flex Lexer,我已经工作了几个小时,我不知道如何从bison文件打印令牌,bison文件是这样的:(这是一个简单的短文件) 这是修改后的版本:问题的解决方案: %{ #include <stdio.h> #include <stdlib.h> void yyerror(const char *); int yylex(void); int id; %} %union { int d; } %error-verbose %token <d> ID %% instr

我已经工作了几个小时,我不知道如何从bison文件打印令牌,bison文件是这样的:(这是一个简单的短文件) 这是修改后的版本:问题的解决方案:

%{

#include <stdio.h>
#include <stdlib.h>
void yyerror(const char *); 
int yylex(void);
int id;
%}

%union {
 int d;
}

%error-verbose
%token <d> ID
%%

instruction: ID { //yylval.d is set in the FLEX file, this prints the ID entered
                 printf("The id is:%d\n",yylval.d);};

%%

int main(){
    if (yyparse()==0)
        printf("Finished.\n");
    else
        printf("Error\n");
}

void yyerror(char const *s)
{
    fprintf(stderr,"err %s\n",s);
}
%{
#包括
#包括
无效错误(常量字符*);
int yylex(无效);
int-id;
%}
%联合{
int d;
}
%错误详细
%令牌ID
%%
说明:在FLEX文件中设置ID{//yylval.d,这将打印输入的ID
printf(“id为:%d\n”,yylval.d);};
%%
int main(){
if(yyparse()==0)
printf(“完成。\n”);
其他的
printf(“错误\n”);
}
无效错误(字符常量*s)
{
fprintf(标准,“错误%s\n”,s);
}
Flex文件如下所示:

%{
#include "sample.tab.h"
#include <math.h>
%}

ID    [0-9]    
ENTER "\n"    
SPACE [ \t\n]+

%%

{ID}    {//the "d" is from the union of the bison file, it connects to it
          yylval.d=atoi(yytext);return(ID);}
{ENTER} {}
{SPACE} {}
.       {printf("Strange character: %s\n", yytext);}

%%
%{
#包括“sample.tab.h”
#包括
%}
ID[0-9]
输入“\n”
空格[\t\n]+
%%
{ID}{//“d”来自bison文件的并集,它连接到它
yylval.d=atoi(yytext);return(ID);}
{输入}{}
{SPACE}{}
.       {printf(“奇怪字符:%s\n”,yytext);}
%%
在我得到这个之后,我想做的是将ID的值存储在一个表中,当我读取另一个ID时,如果它被重复,我会标记一个错误并说:repeatedid! 现在,这些代码告诉我:“非结构或联合中的成员'd'的错误请求”


请帮忙!!!我在网上查过了,什么也没找到=(

您的“会员请求”错误可以通过不设置YYSTYPE来解决;您可以使用%union或YYSTYPE,但不能同时使用两者

尝试修改ID的flex规则,如下所示:

{ID}    {printf("yylex: %s\n", yytext); yylval.d = *yytext - '0'; return(ID);}

它可能不完全是您想要的,但可以编译。由于您的ID当前仅限于一位数字,因此这是可以的;如果您计划使用多位ID值,则需要使用“atoi()”或“strtol()'等。

代码已经修改,并且可以正常工作。我只需要使用yyval连接bison和flex文件,代码中有注释。

问题在于,正如Jonathan所指出的,您已经将YYSTYPE定义为
char cconst*
并使用了
%union
(它也定义了YYSTYPE)因此,在bison文件中,yylval被声明为
char const*
,而在flex文件中,它被声明为union,因此会发生随机的未定义的事情。因此,去掉
#define

此外,在bison文件中,您几乎不希望直接引用yylval,因为这将是最后扫描的令牌的值(可能是您实际想要的ID之后的先行令牌——bison使用1令牌先行,因此lexer通常比解析器早1令牌)。相反,您应该在此处使用
$1

instruction: ID { printf("The id is:%d\n", $1);};

请注意,在本例中,您不需要
.d
,因为它出现在
%ID

%token
声明中,不清楚yyerrork定义的目的是什么…它似乎根本没有必要。对不起,我以前使用过它。谢谢,它没有显示该错误,但它没有打印它打印的数字0,它不是w因为我把它改成了字符类型,它也不打印任何东西。@Beecode:所以你问的第一个问题现在已经解决了——你可以编译了。我也得到了零响应。但是,我不能告诉你要打印什么;这是输入内容的回音,还是输入内容的翻译?我想我必须从lex发送int,转换为yylval.d=atoi(yytext);返回int;但是我得到了:错误YYSTYPE没有名为intval的成员,类似这样的,我是checking@Beecode:关于YYSTYPE错误-确保已重新生成sample.tab.h文件(bison-d sample.y)。在bison文件中,我想获取ID标记的值,因为我会将其存储在表或smt中,当再次输入相同的ID时,它将标记为错误。@Jonathan--如果我按照我所述修复代码(使用$1并删除#define),它对我很好:
echo 5 |/a.out
给我
id是:5
后跟
完成
我删除了#define yystype是的,它不应该在那里!