aboutsummaryrefslogtreecommitdiff
path: root/asm/parser.h
diff options
context:
space:
mode:
Diffstat (limited to 'asm/parser.h')
-rw-r--r--asm/parser.h29
1 files changed, 21 insertions, 8 deletions
diff --git a/asm/parser.h b/asm/parser.h
index 01358fc..a8748d0 100644
--- a/asm/parser.h
+++ b/asm/parser.h
@@ -27,6 +27,9 @@ typedef enum
PERR_EXPECTED_SYMBOL,
PERR_EXPECTED_LABEL,
PERR_EXPECTED_OPERAND,
+ PERR_PREPROCESSOR_EXPECTED_NAME,
+ PERR_PREPROCESSOR_EXPECTED_END,
+ PERR_PREPROCESSOR_UNKNOWN_NAME,
PERR_INVALID_RELATIVE_ADDRESS,
PERR_UNKNOWN_OPERATOR,
PERR_UNKNOWN_LABEL,
@@ -38,32 +41,30 @@ const char *perr_as_cstr(perr_t);
typedef struct
{
inst_t instruction;
- darr_t instructions;
+ s_word address;
struct PLabel
{
char *name;
size_t size;
} label;
- s_word address;
enum PResult_Type
{
PRES_LABEL = 0,
PRES_LABEL_ADDRESS,
PRES_GLOBAL_LABEL,
PRES_RELATIVE_ADDRESS,
- PRES_PP_CONST,
PRES_COMPLETE_RESULT,
} type;
} presult_t;
// TODO: Implement these
presult_t presult_label(const char *, size_t, s_word);
+presult_t presult_label_ref(inst_t, const char *, size_t);
presult_t presult_instruction(inst_t);
-presult_t presult_instructions(size_t);
-presult_t presult_addr(s_word);
-presult_t pres_pp_const(const char *, s_word, size_t);
-// TODO: Refactor parser.c to use this instead
+presult_t presult_relative(inst_t, s_word);
+presult_t presult_global(const char *, size_t, s_word);
void presult_free(presult_t);
+void presults_free(presult_t *, size_t);
typedef struct
{
@@ -74,8 +75,20 @@ typedef struct
label_t search_labels(label_t *, size_t, char *, size_t);
+typedef struct
+{
+ char *name;
+ size_t name_size;
+ darr_t code;
+} block_t;
+
+block_t search_blocks(block_t *, size_t, char *, size_t);
+
+// Analyses then inlines corresponding tokens into stream directly
+perr_t preprocessor(token_stream_t *);
+// Parses from the preprocessed stream
perr_t parse_next(token_stream_t *, presult_t *);
-perr_t preprocessor(presult_t *, size_t, presult_t *);
+// Deals with address building
perr_t process_presults(presult_t *, size_t, prog_t **);
perr_t parse_stream(token_stream_t *, prog_t **);