带有结构指针的野牛递归错误

bison recursion error with struct pointer

我有一个名为 Polyn 的简单结构,如下所示:

typedef struct Polyn {
  int sign;
  int coeff;
  int exp;
  struct Polyn *next;
} Polyn;

在我用于递归构建多项式的野牛语法中,我只得到第一个和最后一个元素。我使用这些函数来添加和使用 Polyn 结构:


Polyn *addmonomial(Polyn *pol, Polyn *monom) {
    pol -> next = monom;
    return pol; 
}

所以对于a=1x2+2x+3,它只给我1x2+3。 递归只会构建第一个和最后一个元素。我不知道是否要更改 add 函数的 return 值或如何更改语法以便包含中间项。 看起来问题是我最后两个递归规则中的 $1 始终是第一项并且不会成为中间项。我需要 return 我的其他语法规则的第一个术语,还需要构建多项式。

    |poln T_PLUS poln   { $$ = addmonomial(, );}
    |poln T_MINUS poln  { Polyn *p2n = negate(); $$ = addmonomial(, p2n); }
Polyn *addmonomial(Polyn *pol, Polyn *monom) {
    pol -> next = monom;
    return pol; 
}

如果 pol 已有 next 值,这将覆盖 next 的现有值。所以如果 pol 表示表达式 1x2+2xmonom 表示 3,那么 2x 部分将被 1.[=20= 覆盖]

去掉你的 addmonomial 函数,改用 addpolynomial 函数。当你这样做时,去掉 sign 字段,它与 coeff 字段的符号是多余的。您可能还希望将 coeff 字段设为 double 而不是 int.

您的 addpolynomial 函数应该合并两个项的链接列表,合并具有相同指数的项。如果你总是让它们按指数顺序排序,可能是最简单的。