嗨,当我运行以下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
;
Run Code Online (Sandbox Code Playgroud)
以下是我的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 */;
%%
Run Code Online (Sandbox Code Playgroud)
这个错误是什么意思?我怎样才能解决这个问题?
这是因为你在%type <...> expression语法的第一部分缺少声明,声明中声明了...某种类型%union.如果没有这个,您将无法访问$$任何expression操作.此外,如果您$$为非终端设置了任何操作,则需要在该非终端的所有操作中进行设置.
通常,您需要为所有非终端决定是否生成可以在使用该非终端的规则中使用的值.如果他们确实产生了这样的价值,他们需要一个%type宣言,每个行动都需要设定$$一些东西.如果他们不这样做,那么没有动作可以使用$1(或其他)访问不存在的值.
对于所有终端,你需要相同的,除了终端,你使用%token而不是%type,你需要设置yylval你的词法分析器,因为它相当于$$.
在您的特定示例中,您已经处理了终端但忽略了非终端.这取决于你想要做什么,你可能要一个%type两个expression和term,但可能不希望之一query.这意味着,每一个term和expression规则需要,设置一个动作$$