The type of a variable can now be either 'integer', 'floating point' or 'string', and is redefineable at runtime. Also, heap allocations are massively reduced by using our own string_t as references to the input program instead of allocating space for and copying every single line and token. This also means that the "lifetime" of the strings in the vector returned by tac_tokenize() is tied to the lifetime of tac_tokenize()'s argument.