Выражение Оценка в C ++ - PullRequest
0 голосов
/ 25 января 2009

Я пишу несколько консольных приложений, похожих на C ++, для домашних заданий. Мое приложение должно иметь возможность принимать формулы для своих ячеек, например, оно должно оценивать что-то вроде этого:

Sum(tablename\fieldname[recordnumber], fieldname[recordnumber], ...)

tablename\fieldname[recordnumber] points to a cell in another table, 
fieldname[recordnumber] points to a cell in current table

или

Sin(fieldname[recordnumber])

или

anotherfieldname[recordnumber]

или

"10" // (simply a number)

что-то в этом роде. Функции: Сумма, Аве, Грех, Кос, Тан, Кота, Мул, Див, Пау, Лог (10), Лн, Мод

Это жалко, я знаю, но это моя домашняя работа: '(

Так кто-нибудь знает хитрость, чтобы оценить что-то подобное?

Ответы [ 5 ]

2 голосов
/ 25 января 2009

Для разбора я бы посмотрел на разбор по Рекурсивному спуску. Затем создайте таблицу, которая отображает все возможные имена функций на указатели функций:

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};
2 голосов
/ 25 января 2009

Ладно, кстати, хороший домашний вопрос.

Это действительно зависит от того, насколько тяжелым ты хочешь быть. Вы можете создать полный анализатор выражений (это весело, но и требует много времени).

Для этого вам нужно описать полную грамматику и написать интерфейс (взгляните на lex и yacc или flexx и bison.

Но, как я вижу ваш вопрос, вы можете ограничиться тремя вариантами:

  • простое значение
  • поиск (возможно, к другой таблице)
  • функция, входы которой являются поисками

Я думаю, что небольшой дизайн ОО может помочь вам здесь.

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

1 голос
/ 25 января 2009

Предыдущие респонденты ударили его по голове: вам нужно проанализировать содержимое ячейки и интерпретировать их .

В StackOverflow уже есть множество вопросов по созданию компиляторов и интерпретаторов, где вы можете найти указатели на ресурсы. Вот некоторые из них:

и так далее.

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

1 голос
/ 25 января 2009

Вы должны написать парсер. Парсер должен взять выражение, т.е. каждую строку, и должен идентифицировать команду и построить дерево разбора. Это первый этап. На втором этапе вы можете оценить дерево, подставив данные для каждого элемента команды.

0 голосов
/ 25 января 2009

Полагаю, вы не можете использовать yacc / lex (или тому подобное), поэтому вам придется анализировать "вручную":
Переберите строку и разделите ее на части. Какая часть зависит от вашей грамматики (синтаксис). Таким образом, вы можете найти имена функций и параметры. Сложность этого зависит от сложности вашего синтаксиса.

Возможно, вам следует прочитать немного о лексическом анализе .

...