0

我正在编写我的第一个 flex 和 bison 程序,它是一个简单的计算器,我希望计算器支持复数运算。

但是,我无法在其中插入甚至处理任何复数,因为我需要 flex 以某种方式同时处理复数的实值和图像值并将其传递给野牛,而且我也不知道野牛如何处理 2 个参数。

这是我的弹性文件:

如您所见,我尝试了一些方法,但这甚至无法编译(使用所有复数过程)。只是为了记录,一个复数看起来像 1.000+2.111i、3i 等。

4

1 回答 1

2

如果你想对你的虚数执行算术计算,你可能想创建一个结构体,比如“img_t”,它有两个字段,比如,real 和 img,然后编写具有“img_t img_add(img_t a , img_t b)"。然后您的野牛作品将为每个操作员调用这些函数。你的 yyunion 应该有一个字段 img_t img。如果您愿意,您也可以在野牛中内联执行这些功能。关键是你的 yyunion 中需要一个包含虚数的结构。

typedef struct {
  double real, img;
} img_t;


%yyunion {
    :
    :
    img_t img;
};
:
:

expr_complex: expr_complex '+' expr_complex          { $$ = img_add($1, $3); }
    :
    :

如果你在 lex 中单独看到一个整数或双精度数,你想把它变成一个虚数吗?如果是这种情况,那么您可以取消 expr_int 和 expr_double 并让所有 lex 标记返回 img_t。

如果您发布一些您想要解析和评估的表达式,我可以发表进一步的评论。

于 2013-11-14T01:04:09.273 回答