1

私はある種の古典的なバイソン/フレックス計算機の実装問題に取り組んでいます。私が実行した問題は、変数の割り当てにあります。最初はうまくいくようです。参照できるのは宣言された変数のみで、割り当てた値を記憶しています...ただし、すべての変数がそれぞれ独自の値を持っているのではなく、単一の値を共有しているように見えます。したがって、「x = 3; y=5;」を実行すると その場合、xとyの両方の値は5になります。

明らかに私は何か間違ったことをしていますが、これがbison、c ++、またはunordered_mapデータ構造がどのように機能するかについての私の理解の失敗であるかどうかはわかりません。(または、おそらく3つすべて)

以下のコードの関連する部分をすべて含めたと思いますが、不足している部分がある場合はお知らせください。

%{

    #include <iostream>
    #include <string>
    #include <unordered_map>
    using namespace std;

    unordered_map<string, double> dict;
%}    

%union {
    double dval;
    char *sval;
}

%token <sval> VARIABLE
%token <dval> NUMBER
%type<dval> expr

%%

assign: 
     VARIABLE '=' expr {dict[$1] = $3; cout << $1<< "="<<dict[$1]<<endl; }
expr: VARIABLE {
    if(dict.find($1) == dict.end())
    {
        yyerror("Bad Var");
    }
4

2 に答える 2

2

フレックスコードも実際に表示する必要がありますが、関連するビットは次のようになっていると思います。

{id}     { yylval.sval = yytext; return VARIABLE; }

あなたがする必要があるのは:

{id}     { yylval.sval = strdup(yytext); return VARIABLE; }

次に、バイソンアクションで使用した後に割り当てられた文字列を解放して、メモリがリークしないようにする必要があります。

フレックスマニュアルバイソンマニュアルを参照してください。

于 2013-03-12T00:32:35.853 に答える
0

したがって、私の問題は、データの保存方法ではなく、データの取得にあることが判明しました。exprの値を実際に設定するには、以下にelseステートメントを追加する必要がありました。

expr: VARIABLE {
    if(dict.find($1) == dict.end())
    {
        yyerror("Bad Var");
    }
    else { //Needed this section
        $$ = dict[$1]
    }
}    

私はそれを行う必要があることを知っていて、忘れてしまったと思いますが、最近割り当てられた変数の値を取得するexprの動作は、私を失望させました。

于 2013-03-13T23:36:47.217 に答える