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$$

一般に、すべての非終端記号について、その非終端記号を使用するルールで使用できる値を生成するかどうかを決定する必要があります。それらがそのような値を生成する場合、それらは%type宣言を必要とし、すべてのアクションは$$何かに設定する必要があります。そうでない場合、$1存在しない値にアクセスするためにアクションを使用することはできません。

ターミナルを除いて、すべてのターミナルに同じものが必要です。%token代わりにを使用し、レクサー%typeに設定する必要があります。yylvalこれは、と同等です$$

特定の例では、終端記号を処理しましたが、非終端記号を無視しました。何をしようとしているのかによっては、と%typeの両方が必要になる場合がありますが、の場合は必要ない場合があります。これは、すべてのルールに設定するアクションが必要であることを意味しますexpressiontermquerytermexpression$$

于 2012-04-19T16:27:14.783 に答える