Я пишу свою первую программу flex и bison, которая представляет собой простой калькулятор, и я бы хотел, чтобы калькулятор поддерживал операции с комплексными номерами.
Но я не могу вставлять или даже обрабатывать любые сложные числа в нем, так как мне нужно, чтобы flex каким-то образом обрабатывал как реальное значение, так и значение изображения сложного числа в одно и то же время и передавал его бизону, а также я не знаю как зубр мог обрабатывать 2 параметра.
Это мой файл flex:
Как вы можете видеть, я пробовал что-то, но это даже не компилируется (со всей сложной процедурой числа). И только для записи комплексное число будет выглядеть как 1.000 + 2.111i, 3i и т.д.
Если вы захотите выполнить арифметические вычисления на своих мнимых числах, вы, вероятно, захотите создать struct say, "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, и все ваши лекс-маркеры возвращают img_t.
Если вы опубликуете некоторые из выражений, которые хотите проанализировать и оценить, я могу сделать дополнительные комментарии.