Написание собственного языка - довольно сложная задача, если вы намереваетесь делать что-то относительно полное. Тысячи строк кода, безусловно, возможны. Я принимал участие в различных формах этого за свои 30 лет профессиональной и хобби жизни - от написания простого анализатора команд в отладчике или аналогичного достаточно хорошо работающего «мини-базового» интерпретатора и небольшого интерпретатора Lisp. Я также создал много «псевдоязыков», где текстовый файл используется как вход для программы, но это не полноценный язык программирования - существует только ограниченный набор переменных.
Еще одна вещь, которую я сделал довольно много, - это «программирование на основе таблиц», где фактический «код» встроен в программу в виде таблиц.
Во всех этих случаях существуют различные формы «У меня есть некоторый ввод/данные, которые я хочу перевести в действие по отношению к другому объекту».
Основным механизмом, как вы описали, является сохранение имени и некоторых других данных (таких как тип) в некоторой структуре данных. std::map<std::string, cVariable>
будет одним из способов относительно легко получить данные из имени (строки) в переменную этого имени.
Вы можете четко сделать то же самое для функций. Разумеется, вы также должны каким-то образом передать аргументы в функцию. Именно то, как вы решаете, это то, что каждый язык должен был решить, и обычно он становится своего рода «стек».
Возможно, у вас есть map<std::string, function>
, который переводится от имени к функции - определение функции может содержать некоторую информацию о количестве и типах аргументов, которые выполняет функция.
Для «встроенных» функций, вы можете также иметь тип argc, argv[]
подхода типа, где аргументы передаются в cVariable
[где один вариант constant
или expression
], чтобы обеспечить myPrint(myVar[0] + 100)
, что, конечно, не является истинным переменная, но результат содержимого переменной, добавленной к константе.
Если вы не написали что-то, что действует как калькулятор с переменными, это, вероятно, будет хорошей отправной точкой.
Многие языки типа «сценарий» имеют переменные, которые являются «полиморфными», то есть значение может использоваться как число или как строка без фактического запроса переменной, подлежащей преобразованию.
Вы пытаетесь построить компилятор. Удачи. – SLaks
Рассмотрите возможность использования LLVM. – SLaks
Ваш единственный фактический вопрос, похоже, называется «как преобразовать входную строку в функцию()?». Я рекомендую библиотеку 'boost :: spirit' - вам будет сложно научиться, но как только вы это поймете, вы сможете более легко и более совершенствовать свою программу. Если вы хотите быстро начать, использование регулярных выражений может помочь вам проверить назначение и вызовы функций, извлечь значения аргументов и т. Д. Еще более базовые, вы можете использовать 'sscanf()'. «Я думаю, что этот путь не очень хорош» - если вы объясните свои проблемы, люди могут прокомментировать. Наиболее очевидный комментарий: используйте ruby / perl/etc. –