Нет ничего готового в стандартной библиотеке для разбора выражений, нет. Тем не менее, это отличное упражнение для того, чтобы самостоятельно развернуть анализатор/оценщик. Я не хочу испортить веселье, но вот несколько мыслей:
Идея состоит в том, чтобы сначала разобрать входную строку в какую-то структуру данных, которая представляет выражение (обычно какую-то древовидную структуру), а затем " оценить "эту структуру данных с некоторыми заданными привязками переменных.
Структура данных может быть tagged union, что-то вроде этого:
enum ValueType {
ConstantValue, VariableValue, Addition, Division
};
struct Value {
enum ValueType type;
/* The 'representation' of the value. */
union {
int constantValue;
const char *variableValue;
struct {
struct Value *summand1;
struct Value *summand2;
} additionValue;
struct {
struct Value *dividend;
struct Value *divisor;
} divisionValue;
} repr;
};
Для синтаксического анализа, то я предлагаю прочитать на анализаторах «рекурсивных», площадь которого довольно легко понять и писать вручную , Цель состоит в том, чтобы определить функцию
Value *parse(const char *s);
, которая возвращает представление для данной строки.
Оценка часть довольно проста и поддается рекурсии. Цель состоит в том, чтобы определить функцию
int eval(const Value *v, ??? bindings);
... где ???
бы некоторый тип необходимости для проведения связывания переменных (например, строка int
отображения). В зависимости от «типа» данного значения, он будет выполнять арифметические операции, например:
int eval(const Value *v, ??? bindings) {
switch (v->type) {
case ConstantValue:
return v->repr.constantValue;
case Addition:
return eval(v->repr.additionValue.summand1) + eval(v->repr.additionValue.summand2);
...
Извините, но что точно выполняются 'parse_formula()', которые не могут быть выполнены _usual_ способом? –
@SouravGhosh он ищет библиотеку для синтаксического анализа функции до значения. – Hristo
Mr @Chris что-то вроде 'double result = ((data1 + data2)^data3)/data4' или я что-то упускаю? –