#pragma once #include #include "compiler/tree_parser/tree_parser.h" #include "utils/types.h" typedef enum Command { COMMAND_NONE = 0, COMMAND_CALL_FUNCTION, COMMAND_PUSH_STRING, COMMAND_PUSH_IDENTIFIER, COMMAND_POP_IDENTIFIER, } Command; extern const char *COMMAND_STRINGS[]; typedef struct Instruction { Command command; void *operand; } Instruction; typedef struct Instructions { Instruction *restrict instructions; size_t size; } Instructions; typedef SizedString CommandCallFunctionOperand; typedef SizedString CommandPushStringOperand; typedef SizedString CommandPushIdentifierOperand; typedef SizedString CommandPopIdentifierOperand; extern void printInstruction(Instruction instruction); extern void printInstructions(Instructions instructions); extern void deleteInstruction(Instruction instruction); extern void deleteInstructions(Instructions instructions); extern Instructions codeGenerator(SourceCode *code); extern Instructions codeGeneratorWithPrint(SourceCode *code); extern Instructions _codeGenerator(ParsedTree *root, SourceCode *code); extern bool nodeToInstruction(ParsedTree *tree, Instruction **instructions, size_t *instructions_size, size_t *instructions_inserted, SourceCode *code); extern void insertInstruction(const Instruction instruction, Instruction **restrict instructions, size_t *restrict instructions_size, size_t *restrict instructions_inserted);