Выполнение чего-нибудь полезного.
Достаточно настроек, добавим немного функционала. У нас есть всё для того, чтобы создать интерпретатор. В следующем разделе я постараюсь сосредоточится на очень простом интерпретаторе. Никакого редактора, никакой встроенной отладки, только консоль, которая позволит нам печатать команды lua и смотреть на результаты интерпретатора. Нам потребуется узнать еще одну lua функцию: lua_dostring(). По существу, эта функция выполняет действия в lua. Я не знаю, как по другому объяснить, проще взглянуть на фрагмент кода:
#include <stdio.h>
extern "C" { #include <lua.h> } int main(int argc, char* argv[ ]) { lua_State* luaVM = lua_open(0); if( NULL == luaVM ) { printf("Error Initializing lua\n"); return -1; } // Используем lua. char* strLuaInput = "a = 1 + 1;\n"; lua_dostring(luaVM, strLuaInput); lua_close(luaVM); return 0; } |
Выполнение и компилирование этого приложения вернет следующее:
Это совершенно, абсолютно … бесполезно. И что нам сделать, чтобы это стало менее бесполезно? Хорошо, если Вы сползали и скачали lua или видали другие примеры lua, Вам наверное попалась на глаза функция print. Итак, добавим ее в код и возьмем в оборот. Вот код, который мы использовали бы.
#include <stdio.h>
extern "C" { #include <lua.h> } int main(int argc, char* argv[ ]) { lua_State* luaVM = lua_open(0); if (NULL == luaVM) { printf("Error Initializing lua\n"); return -1; } // Используем lua. char* strLuaInput = "a = 1 + 1;\nprint( a);\n"; lua_dostring(luaVM, strLuaInput); lua_close(luaVM); return 0; } |
Компиляция не имеет проблем, а вот выполнение это уже другая история:
Так в чем же дело? Я лгал? Мне кажется, прежде всего, это сообщение означает, что функция 'print' является нулевым (читайте как: пустой указатель) значением. Есть ли фактически функция с именем print() ? Да, есть, но она не определена как стандартная в среде lua. Нам необходима связь используемой библиотеки с нашим приложением.
Этот механизм, по существу, расширение lua для наших собственных эгоистичных целей. Так или иначе, мы можем заставить работать print() и некоторые другие уместные функции, следующим образом:
#include <stdio.h> extern "C" { #include <lua.h> } int main(int argc, char* argv[ ]) { lua_State* luaVM = lua_open(0); if (NULL == luaVM) { printf("Error Initializing lua\n"); return -1; } // инициализация стандартных библиотечных функции lua lua_baselibopen(luaVM); lua_iolibopen(luaVM); lua_strlibopen(luaVM); lua_mathlibopen(luaVM); // Используем lua. char* strLuaInput = "a = 1 + 1;\nprint( a);\n"; lua_dostring(luaVM, strLuaInput); lua_close(luaVM); return 0; } |
Я также могу вывести его более наглядно, изменяя команды, посланные lua:
#include <stdio.h> extern "C" { #include <lua.h> } int main(int argc, char* argv[ ]) { lua_State* luaVM = lua_open(0); if (NULL == luaVM) { printf("Error Initializing lua\n"); return -1; } // инициализация стандартных библиотечных функции lua lua_baselibopen(luaVM); lua_iolibopen(luaVM); lua_strlibopen(luaVM); lua_mathlibopen(luaVM); // Используем lua. char* strLuaInput = "a = 1 + 1;\nprint( \"1 + 1: \" .. a);\n"; lua_dostring(luaVM, strLuaInput); lua_close(luaVM); return 0; } |
Это сравнительно простой материал и мы можем, основываясь на нем, построить простой интерпретатор. Все, что мы должны сделать сейчас - это добавить средства для захвата некоторого текста. Я сделал это в проекте FunctionalInterpreter. Это элементарный интерпретатор и не более чем простое расширение проекта SimpleInterpreter. Я не буду пробегаться по коду.Это просто расширение того, о чем я писал выше.
Страницы: 1 2 3 4 5 Следующая страница
Перевод: Alexandr Fedotovskih
Версия для печати