0

さて、Bison .l ファイルに次のコードがあります。ちなみに私はcが初めてです。

exp: TK_SLIT    // TK_SLIT is a string literal token

      /* assigns the type to the nonterminal exp */
      $$ ->type = (char *) malloc (strlen ("string") + 1);  /* allocates space */
      strcpy ($$->type,"string");  /* puts value in there */ 
      printf ("%s\n",$$->type);

      printf ("The value of TK_SLIT is - %s\n",$1);

コードの「型の割り当て」ブロック (コメントを含む 4 行) がメモリ内の TK_SLIT ($1) の値を上書きすることがわかりました。TK_SLIT の値は、スキャナー FLEX から取得しました。

「型の割り当て」コード ブロックをコメント アウトすると、TK_SLIT トークン値が正常に出力されるため、コード ブロックが問題の原因であることはわかっています。そうしないと文字化けします。

私のmallocに何か問題がありますか?トークン値が上書きされるのはなぜですか? これは、メモリ内のトークン値を保護していないバイソンの問題ですか?

さて、私の組合は次のとおりです。

%union
{

    int intbison;
    char *charbison; // used for input
    char *boolbison;
    int voidbison;
    charlist *charlistbison;
    arraylist *arraylistbison;
    expnode *expnodebison;
}

また、ヘッダー ファイルからの私の expnode は次のとおりです。

   typedef struct expnode{
        char *type;
        typesymrec *typesymrecptr;
        varsymrec *varsymrecptr;
        char *stringval;
        int intval;
        int boolval;


}expnode;

そして、「exp」を非終端記号「expnodebison」型にしました。

4

1 に答える 1

1

最後にそれを理解しました。

問題は、$$ が expnode 構造体型であり、これを malloc する必要があることでした。

これを行うと、TK_SLIT $1 トークンが保持されました。以下は修正です

exp: TK_SLIT    // TK_SLIT is a string literal token

    $$ = (expnode *) malloc (sizeof (expnode));
    $$ ->type = (char *) malloc (strlen ("string") + 1);  /* allocates space */
    strcpy ($$->type,"string");  /* puts value in there */ 
    printf ("%s\n",$$->type);

    printf ("The value of TK_SLIT is - %s\n",$1);


}
于 2012-04-14T06:43:42.907 に答える