gpt4 book ai didi

c - Bison 警告 “… has no declared type”

转载 作者:行者123 更新时间:2023-12-02 08:48:48 24 4
gpt4 key购买 nike

您好,当我运行以下 Bison 时,我发现 $$ 没有返回类型:

%{
#include <stdio.h>
#include <string.h>

void yyerror(const char *str)
{
fprintf(stderr,"error: %s\n",str);
}

int yywrap()
{
return 1;
}

main()
{
yyparse();
}

%}
%start query
%token AND OR GREATER LESS COLON TO

%union
{
int number;
char *string;
}

%token <number> VALUE
%token <string> WORD

%%

query: /* empty */
| query expression { }
;

expression:
term
|expression AND term {$$=$1}
|expression OR term {}
;

term:
WORD { printf("Term:%s\t",$1);}
| VALUE
;

以下是我的 flex:

%{
#include <stdio.h>
#include <string.h>
#include "y.tab.h"
%}
%%
":" return COLON;
"and"|"&"|"&&" return AND;
"or"|"|"|"||" return OR;
".." return TO;
">" return GREATER;
"<" return LESS;
\n /* ignore end of line */;
\t /* ignore end of line */;

%%

这个错误是什么意思?我该如何解决这个问题?

最佳答案

这是因为您缺少声明 %type <...> expression在语法的第一部分,...是在您的 %union 中声明的某种类型陈述。没有这个,您将无法访问 $$在任何 expression行动。此外,如果您设置 $$在非终端的任何操作中,您需要在该非终端的所有操作中设置它。

一般来说,您需要为所有非终结符决定它们是否产生可在使用该非终结符的规则中使用的值。如果他们确实产生了这样的值(value),他们需要一个 %type声明和每个 Action 都需要设置$$到某事。如果他们不这样做,则没有任何操作可以使用 $1 (或其他)访问不存在的值。

所有终端都需要相同,除了终端,您使用 %token而不是 %type , 你需要设置 yylval在你的词法分析器中,因为这相当于 $$ .

在您的特定示例中,您处理了终端但忽略了非终端。根据您要执行的操作,您可能需要 %type对于expressionterm , 但可能不想要一个 query .这意味着每个 termexpression规则需要设置 $$ 的操作

关于c - Bison 警告 “… has no declared type”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10232142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com