2

嗨,当我运行以下 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
        ;

以下是我的弹性:

%{
#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 */;

%%

这个错误是什么意思?我怎样才能解决这个问题?

4

1 回答 1

7

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

通常,您需要为所有非终结符确定它们是否生成可用于使用该非终结符的规则中的值。如果他们确实产生了这样的值,他们需要一个%type声明,并且每个动作都需要设置$$一些东西。如果他们不这样做,那么任何操作都不能使用$1(或其他)来访问不存在的值。

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

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

于 2012-04-19T16:27:14.783 回答