aboutsummaryrefslogtreecommitdiff
path: root/src/compiler/code_generator/code_generator.h
blob: 1a9b4ff8de7a6947cd17322357100aec0ec41a35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#pragma once

#include <stdio.h>

#include "compiler/parser/parser.h"
typedef enum Command {
  COMMAND_NONE = 0,
  COMMAND_PRINT,
  COMMAND_PUSH_STRING,
} Command;

extern const char *COMMAND_STRINGS[];

typedef struct Instruction {
  Command command;
  void *operand;
} Instruction;

typedef struct Instructions {
  Instruction *restrict instructions;
  size_t size;
} Instructions;

extern void printInstruction(Instruction instruction);
extern void printInstructions(Instructions instructions);

extern void deleteInstruction(Instruction instruction);
extern void deleteInstructions(Instructions instructions);

extern Instructions codeGenerator(ParsedNode *root);

extern bool nodeToInstruction(ParsedNode *node, Instruction **instructions,
                              size_t *instructions_size,
                              size_t *instructions_inserted);

extern void insertInstruction(const Instruction instruction,
                              Instruction **restrict instructions,
                              size_t *restrict instructions_size,
                              size_t *restrict instructions_inserted);

extern SizedString *nodeToString(ParsedNode const *node);