Создание приложения на C ++ для сценариев - PullRequest
8 голосов
/ 28 января 2009

У меня в программе несколько функций, которые выглядят так:

void foo(int x, int y)

Теперь я хочу, чтобы моя программа взяла строку, похожую на:

foo(3, 5)

И выполнить соответствующую функцию. Какой самый простой способ реализовать это?

Когда я говорю прямо, я имею в виду достаточно расширяемый и элегантный, но это не должно занять слишком много времени для кодирования.

Edit:

Хотя использование реального языка сценариев, конечно, решит мою проблему, я все же хотел бы знать, есть ли быстрый способ реализовать это на чистом C ++.

Ответы [ 8 ]

10 голосов
/ 28 января 2009

Вы можете встраивать Python довольно просто, и это даст вам действительно мощный, расширяемый способ написания сценариев вашей программы. Вы можете использовать следующее, чтобы легко (более или менее) представить свой код C ++ для Python:

Лично я использую Boost Python, и я доволен им, но он медленно компилируется и может быть трудно отладить.

8 голосов
/ 28 января 2009

Вы можете взглянуть на Lua .

5 голосов
/ 28 января 2009

Я бы также пошел за ответ на языке сценариев.

Используя чистый C ++, я бы, вероятно, использовал генератор синтаксического анализатора, который получит токен и правила грамматики и даст мне код на C, который точно может анализировать данный язык вызова функции, и предоставит мне синтаксическое дерево этого вызов. flex может использоваться для токенизации ввода, а bison может использоваться для анализа токенов и преобразования их в синтаксическое дерево. В качестве альтернативы этому подходу Boost Spirit также может использоваться для анализа языка вызова функций. Я никогда не использовал ни один из этих инструментов, но работал над программами, которые их используют, поэтому я немного знаю, что бы я использовал, если бы мне пришлось решать эту проблему.

Для очень простых случаев вы можете изменить свой синтаксис так:

func_name arg1, arg2

Тогда вы можете использовать:

std::istringstream str(line);
std::string fun_name; str >> fun_name;
map[fun_name](tokenize_args(str));

Карта будет

std::map<std::string, boost::function<void(std::vector<std::string>)> > map;

Которые будут заполнены функциями в начале вашей программы. tokenize_args будет просто разделять аргументы и возвращать их вектор в виде строк. Конечно, это очень примитивно, но я думаю, что разумно, если все, что вам нужно, это какой-то способ вызова функции (конечно, если вы действительно хотите поддержку сценариев, этого подхода будет недостаточно).

3 голосов
/ 28 января 2009

Как сказал Даниил:

Языки сценариев, такие как Lua и Python, будут наиболее часто используемыми языками сценариев для связывания библиотек c ++.

Вам нужно будет добавить интерфейс сценариев в ваше приложение c ++. Создание этого интерфейса, очевидно, зависит от того, какой язык сценариев вы выбрали.

2 голосов
/ 23 марта 2009

CERN предоставляет CINT , интерпретатор C / C ++, который может быть встроен в ваше приложение для обеспечения возможностей сценариев.

1 голос
/ 23 марта 2009

C ++ Reflection [2] Фабио Ломбарделли (Fabio Lombardelli) обеспечивает полное переотражение C ++ с помощью методов метапрограммирования шаблонов. Хотя он полностью соответствует стандартам C ++, он требует, чтобы программист аннотировал классы, чтобы они были отражающими

http://cppreflect.sourceforge.net/

в противном случае вам нужна хеш-таблица указателя на функцию, я думаю

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

Если вы хотите вызывать функцию только по буквальному имени, вы можете использовать функции, связанные с компоновщиком.

В POSIX-совместимых операционных системах (например, Linux) вы можете использовать dlopen () и dlsym (). Вы просто анализируете входную строку и выясняете имя функции и аргументы. Затем вы можете попросить компоновщика найти функцию по имени, используя dlsym ().

Однако в Windows эти функции недоступны (если только вокруг нет какой-либо среды POSIX, такой как Cygwin). Но вы можете использовать Windows API.

Вы можете посмотреть здесь детали для этих вещей: http://en.wikipedia.org/wiki/Dynamic_loading

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

Должна ли ваша система "брать строку"? Вы можете выставить интерфейсы COM (или CORBA, или что-то еще) в вашем приложении, и все, что генерирует эти команды, будет вызываться непосредственно в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...