diff --git a/include/libabacus.h b/include/libabacus.h index f9f8f59..a5507fa 100644 --- a/include/libabacus.h +++ b/include/libabacus.h @@ -50,7 +50,7 @@ libab_result libab_init(libab* ab); * @param func the function that describes the functionality of the operator. * @return the result of the initialization. */ -libab_result libab_register_operator_infix(libab* ab, const char* op, int precedence, int associativity, const char* type, libab_function_ptr func); +libab_result libab_register_operator_infix(libab* ab, const char* op, int precedence, int associativity, libab_ref* type, libab_function_ptr func); /** * Registers an operation with libabacus that appears * before its operand. @@ -60,7 +60,7 @@ libab_result libab_register_operator_infix(libab* ab, const char* op, int preced * @param func the function that describes the functionality of the operator. * @return the result of the registration. */ -libab_result libab_register_operator_prefix(libab* ab, const char* op, const char* type, libab_function_ptr func); +libab_result libab_register_operator_prefix(libab* ab, const char* op, libab_ref* type, libab_function_ptr func); /** * Registers an operation with libabacus that appears * after its operand. @@ -70,7 +70,7 @@ libab_result libab_register_operator_prefix(libab* ab, const char* op, const cha * @param func the function that describes the functionality of the operator. * @return the result of the registration. */ -libab_result libab_register_operator_postfix(libab* ab, const char* op, const char* type, libab_function_ptr func); +libab_result libab_register_operator_postfix(libab* ab, const char* op, libab_ref* type, libab_function_ptr func); /** * Registers a function with libabacus. @@ -80,7 +80,7 @@ libab_result libab_register_operator_postfix(libab* ab, const char* op, const ch * @param func the function that describes the functionality of the function. * @return the result of the registration. */ -libab_result libab_register_function(libab* ab, const char* name, const char* type, libab_function_ptr func); +libab_result libab_register_function(libab* ab, const char* name, libab_ref* type, libab_function_ptr func); /** * Registers a base type with abacus. * @param ab the libabacus instance used to keep state. @@ -89,6 +89,15 @@ libab_result libab_register_function(libab* ab, const char* name, const char* ty * @return the result of the registration. */ libab_result libab_register_basetype(libab* ab, const char* name, libab_basetype* basetype); +/** + * Constructs and resolves a parse type, similarly to how it's done in the + * parser. + * @param ab the libab instance to use for constructing the type. + * @param into the reference to populate with the given type. + * @param type the type to parse. + * @return the result of the operation. + */ +libab_result libab_create_type(libab* ab, libab_ref* into, const char* type); /** * Releases all the resources allocated by libabacus. * @param ab the libabacus instance to release. diff --git a/src/libabacus.c b/src/libabacus.c index 94cdab0..cd6fd88 100644 --- a/src/libabacus.c +++ b/src/libabacus.c @@ -149,6 +149,19 @@ libab_result libab_register_basetype(libab* ab, const char* name, libab_basetype return result; } +libab_result libab_create_type(libab* ab, libab_ref* into, const char* type) { + libab_result result; + ll tokens; + ll_init(&tokens); + result = libab_lexer_lex(&ab->lexer, type, &tokens); + if(result == LIBAB_SUCCESS) { + result = libab_parser_parse_type(&ab->parser, &tokens, type, into); + } + ll_foreach(&tokens, NULL, compare_always, libab_lexer_foreach_match_free); + ll_free(&tokens); + return result; +} + libab_result libab_free(libab* ab) { libab_table_free(&ab->table); libab_parser_free(&ab->parser);