числа гибкие и зубров

0

Я пишу свою первую программу flex и bison, которая представляет собой простой калькулятор, и я бы хотел, чтобы калькулятор поддерживал операции с комплексными номерами.

Но я не могу вставлять или даже обрабатывать любые сложные числа в нем, так как мне нужно, чтобы flex каким-то образом обрабатывал как реальное значение, так и значение изображения сложного числа в одно и то же время и передавал его бизону, а также я не знаю как зубр мог обрабатывать 2 параметра.

Это мой файл flex:

Как вы можете видеть, я пробовал что-то, но это даже не компилируется (со всей сложной процедурой числа). И только для записи комплексное число будет выглядеть как 1.000 + 2.111i, 3i и т.д.

  • 0
    В моем ответе я предлагаю один подход, возможно, лучше будет использовать встроенные в C комплексные числа stackoverflow.com/questions/6418807/…
Теги:
bison
flex-lexer

1 ответ

2
Лучший ответ

Если вы захотите выполнить арифметические вычисления на своих мнимых числах, вы, вероятно, захотите создать 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.

Если вы опубликуете некоторые из выражений, которые хотите проанализировать и оценить, я могу сделать дополнительные комментарии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню