#pragma once enum NodeKind { NODE_CHAR, TYPE_VOID, TYPE_INT32, TYPE_BYTE, TYPE_SIZE, TYPE_REMOVE_CV, TYPE_ARRAY, TYPE_DECLTYPE, VALUE_DIFFERENCE, VALUE_SUM, VALUE_PRODUCT, VALUE_QUOTIENT, VALUE_EXTENT, VALUE_TUPLE_SIZE, VALUE_INTEGRAL_CONSTANT, STMT_EMIT }; struct Node { enum NodeKind kind; int line; char character; struct Node* first; struct Node* second; struct Node* next; }; 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_append(struct Node* list, struct Node* node); void node_free(struct Node* node);