Add utility function for executing code.
This commit is contained in:
parent
03cce8d1fb
commit
a6029d7ef4
|
@ -159,6 +159,15 @@ libab_basetype* libab_get_basetype_function(libab* ab);
|
||||||
*/
|
*/
|
||||||
libab_basetype* libab_get_basetype_function_list(libab* ab);
|
libab_basetype* libab_get_basetype_function_list(libab* ab);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Executes the given string of code.
|
||||||
|
* @param ab the libabacus instance to use for executing code.
|
||||||
|
* @param string the string to execute.
|
||||||
|
* @param value the reference into which to store the result.
|
||||||
|
* @return the result of the computation.
|
||||||
|
*/
|
||||||
|
libab_result libab_run(libab* ab, const char* string, libab_ref* value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Releases all the resources allocated by libabacus.
|
* Releases all the resources allocated by libabacus.
|
||||||
* @param ab the libabacus instance to release.
|
* @param ab the libabacus instance to release.
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "value.h"
|
#include "value.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
void _free_function_list(void* function_list) {
|
void _free_function_list(void* function_list) {
|
||||||
libab_function_list_free(function_list);
|
libab_function_list_free(function_list);
|
||||||
|
@ -341,6 +342,33 @@ libab_basetype* libab_get_basetype_function_list(libab* ab) {
|
||||||
return &_basetype_function_list;
|
return &_basetype_function_list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libab_result libab_run(libab* ab, const char* string, libab_ref* value) {
|
||||||
|
libab_result result = LIBAB_SUCCESS;
|
||||||
|
ll tokens;
|
||||||
|
libab_tree* root;
|
||||||
|
|
||||||
|
ll_init(&tokens);
|
||||||
|
libab_ref_null(value);
|
||||||
|
|
||||||
|
result = libab_lexer_lex(&ab->lexer, string, &tokens);
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
result = libab_parser_parse(&ab->parser, &tokens, string, &root);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(result == LIBAB_SUCCESS) {
|
||||||
|
libab_debug_print_tree(root);
|
||||||
|
libab_ref_free(value);
|
||||||
|
result = libab_interpreter_run(&ab->intr, root, value);
|
||||||
|
libab_tree_free_recursive(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
ll_foreach(&tokens, NULL, compare_always, libab_lexer_foreach_match_free);
|
||||||
|
ll_free(&tokens);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
libab_result libab_free(libab* ab) {
|
libab_result libab_free(libab* ab) {
|
||||||
libab_ref_free(&ab->table);
|
libab_ref_free(&ab->table);
|
||||||
libab_ref_free(&ab->type_num);
|
libab_ref_free(&ab->type_num);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user