#pragma once #include #include // names longer than this are refused, nobody needs a longer name #define NAME_LENGTH_MAX 15 enum NodeKind { NODE_CHAR, NODE_PARAMETER, TYPE_VOID, TYPE_INT32, TYPE_BYTE, TYPE_SIZE, TYPE_REMOVE_CV, TYPE_ARRAY, TYPE_CONDITIONAL, TYPE_DECLTYPE, TYPE_CHAR, TYPE_CHAR_CONSTANT, TYPE_TUPLE, TYPE_INVOKE, VALUE_DIFFERENCE, VALUE_SUM, VALUE_PRODUCT, VALUE_QUOTIENT, VALUE_EXTENT, VALUE_TUPLE_SIZE, VALUE_INTEGRAL_CONSTANT, VALUE_CONDITIONAL, VALUE_VARIABLE, VALUE_DECLVAL, COND_TRUE, COND_FALSE, COND_IS_SAME, COND_EQUAL, COND_LESS, STMT_DECLARE, STMT_UNDECLARE, STMT_ENABLE_IF, STMT_REPEAT, STMT_EMIT, STMT_STATIC_ASSERT, STMT_DEFINE, STMT_RETURN }; struct Name { char text[NAME_LENGTH_MAX + 1]; size_t length; }; struct Node { enum NodeKind kind; int line; char character; char name[NAME_LENGTH_MAX + 1]; struct Node* first; struct Node* second; struct Node* third; struct Node* body; struct Node* next; }; void name_init(struct Name* name); bool name_push(struct Name* name, char character); struct Node* node_leaf(enum NodeKind kind); struct Node* node_char(char character); struct Node* node_unary(enum NodeKind kind, struct Node* first); struct Node* node_binary(enum NodeKind kind, struct Node* first, struct Node* second); struct Node* node_ternary(enum NodeKind kind, struct Node* first, struct Node* second, struct Node* third); struct Node* node_named(enum NodeKind kind, const struct Name* name, struct Node* first); struct Node* node_block(enum NodeKind kind, struct Node* first, struct Node* body); struct Node* node_append(struct Node* list, struct Node* node); void node_free(struct Node* node);