Как получить пользовательскую функцию и превратить ее в указатель? - PullRequest
1 голос
/ 02 ноября 2011

Я хотел бы знать, есть ли способ получить пользовательскую функцию (с двумя переменными) из stdin в математической форме и превратить ее в указатель на функцию. Другими словами, я хочу запустить:

> ./program a*b

Программа превращает это в указатель на функцию, которая возвращает:

 return a*b;

Итак, вывод program равен

user_defined_function (целое) (целое)

, которая затем станет частью гораздо более крупной программы.

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

Ответы [ 4 ]

2 голосов
/ 02 ноября 2011

Просто для удовольствия, вот ссылка на CINT

CINT - интерпретатор для кода C и C ++ ...

... Сценарий CINT может вызывать скомпилированные классы / функции, а скомпилированный код может выполнять обратные вызовы к интерпретируемым функциям CINT ...

Я не говорю, что это«хорошее» решение (и на самом деле оно может быть очень «плохим» в некоторых случаях!), но некоторые люди уже приложили немало усилий - «чуть менее 400 000 строк кода» - в этот проект ;-)

Удачного кодирования.

2 голосов
/ 02 ноября 2011

Простого решения для этого не существует, поскольку вам придется сгенерировать код.

Упрощенное решение, которое мне приходит в голову:

  • сгенерируйте файл C изнутри вашегопрограмма, которая имеет только одну функцию, вставляя аргумент командной строки в качестве оператора возврата
  • , придает функции известное или сгенерированное имя
  • , исполняет компилятор и динамически генерирует общую библиотеку
  • загрузить эту разделяемую библиотеку
  • вызов известной функции

Боюсь, что не проще, чем это.

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

1 голос
/ 02 ноября 2011

Это очень трудно сделать в C, потому что это скомпилированный язык. Вы можете сделать то, что предлагает Марио Ложка , или вы можете переключиться на динамический язык, такой как ruby ​​или javascript. Эти языки имеют метод «eval», который принимает строку и выполняет код внутри строки, и они имеют возможность динамически определять функции.

0 голосов
/ 02 ноября 2011

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

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