Add a parse type struct, used to hold type data as it is parsed.
This commit is contained in:
parent
55f397d732
commit
bb26405df0
|
@ -8,7 +8,7 @@ project(libabacus)
|
||||||
|
|
||||||
add_compile_options(-pedantic -Wall)
|
add_compile_options(-pedantic -Wall)
|
||||||
|
|
||||||
add_library(abacus STATIC src/lexer.c src/util.c src/table.c src/parser.c src/libabacus.c src/tree.c src/debug.c)
|
add_library(abacus STATIC src/lexer.c src/util.c src/table.c src/parser.c src/libabacus.c src/tree.c src/debug.c src/parsetype.c)
|
||||||
add_executable(libabacus src/main.c)
|
add_executable(libabacus src/main.c)
|
||||||
add_subdirectory(external/liblex)
|
add_subdirectory(external/liblex)
|
||||||
|
|
||||||
|
|
56
include/parsetype.h
Normal file
56
include/parsetype.h
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#ifndef LIBABACUS_PARSETYPE_H
|
||||||
|
#define LIBABACUS_PARSETYPE_H
|
||||||
|
|
||||||
|
#include "result.h"
|
||||||
|
#include "vec.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The variant of the given parse type.
|
||||||
|
*/
|
||||||
|
enum libab_parsetype_variant_e {
|
||||||
|
PT_STRING,
|
||||||
|
PT_PARENT
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A parse type.
|
||||||
|
* A parse type is a type as it was parsed, not
|
||||||
|
* resolved. Effectively, it doesn't have to be valid,
|
||||||
|
* or it can contain references to types whose adresses
|
||||||
|
* are not yet known. The parse type is recursive,
|
||||||
|
* with PT_STRING being the "base case", and PT_PARENT
|
||||||
|
* meaning an initialized children vector with the sub-parse types.
|
||||||
|
*/
|
||||||
|
struct libab_parsetype_s {
|
||||||
|
/**
|
||||||
|
* The variant of the given parse type.
|
||||||
|
*/
|
||||||
|
enum libab_parsetype_variant_e variant;
|
||||||
|
/**
|
||||||
|
* The name of the type that this parse type describes.
|
||||||
|
*/
|
||||||
|
char* name;
|
||||||
|
/**
|
||||||
|
* A vector of children that this parse type contains.
|
||||||
|
* The children are effectively type parameters.
|
||||||
|
*/
|
||||||
|
vec children;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum libab_parsetype_variant_e libab_parsetype_variant;
|
||||||
|
typedef struct libab_parsetype_s libab_parsetype;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees the data associated with this type, ignoring
|
||||||
|
* its children.
|
||||||
|
* @param type the type to free.
|
||||||
|
*/
|
||||||
|
void libab_parsetype_free(libab_parsetype* type);
|
||||||
|
/**
|
||||||
|
* Recursively frees the given parse type, calling free
|
||||||
|
* on every single type (including the one passed in).
|
||||||
|
* @param type the type to free.
|
||||||
|
*/
|
||||||
|
void libab_parsetype_free_recursive(libab_parsetype* type);
|
||||||
|
|
||||||
|
#endif
|
18
src/parsetype.c
Normal file
18
src/parsetype.c
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#include "parsetype.h"
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
int _foreach_free_child(void* data, va_list args) {
|
||||||
|
libab_parsetype_free_recursive(data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
void libab_parsetype_free(libab_parsetype* type) {
|
||||||
|
free(type->name);
|
||||||
|
}
|
||||||
|
void libab_parsetype_free_recursive(libab_parsetype* type) {
|
||||||
|
if(type->variant == PT_PARENT) {
|
||||||
|
vec_foreach(&(type->children), NULL, compare_always, _foreach_free_child);
|
||||||
|
vec_free(&(type->children));
|
||||||
|
}
|
||||||
|
libab_parsetype_free(type);
|
||||||
|
free(type);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user