Вопрос

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

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)

что-то в этом роде.функциями являются Sum, Ave, Sin, Cos, Tan, Cot, Mul, Div, Pow, Log (10), Ln, Mod

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

Итак, кто-нибудь знает трюк для оценки чего-то подобного?

Это было полезно?

Решение

Ок, кстати, хороший вопрос для домашнего задания.

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

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

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

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

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

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

Другие советы

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

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};

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

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

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

и так далее.

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

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

Может быть, вам стоит немного почитать о лексический анализ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top