嗨,当我运行以下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 */;
%%
这个错误是什么意思?我该如何解决这个问题?
答案 0 :(得分:6)
这是因为你在语法的第一部分缺少声明%type <...> expression
,其中...
是你%union
语句中声明的某种类型。如果不这样做,您就无法在任何$$
操作中访问expression
。此外,如果您在非终端的任何操作中设置$$
,则需要在该非终端的所有操作中设置它。
通常,您需要为所有非终端决定是否生成可以在使用该非终端的规则中使用的值。如果他们确实产生了这样的值,他们需要%type
声明,并且每个操作都需要设置$$
。如果他们不这样做,那么任何行动都不能使用$1
(或其他)来访问不存在的值。
除了终端之外,您需要使用%token
代替%type
的所有终端,并且需要在词法分析器中设置yylval
,因为它等同于{ {1}}。
在您的特定示例中,您已经处理了终端但忽略了非终端。根据您要执行的操作,您可能需要$$
和%type
expression
,但可能不需要term
。这意味着每个query
和term
规则都需要设置expression