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'd。

一旦我这样做了,我的 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 回答