From 4990d93a1c333c032e5ee0f1fc4aa3a02a7d41fc Mon Sep 17 00:00:00 2001 From: Aryadev Chavali Date: Thu, 2 Nov 2023 20:31:55 +0000 Subject: Created a preprocessing unit presult_t and a function to process them Essentially a presult_t contains one of these: 1) A label construction, which stores the label symbol into `label` (PRES_LABEL) 2) An instruction that calls upon a label, storing the instruction in `instruction` and the label name in `label` (PRES_LABEL_ADDRESS) 3) An instruction that uses a relative address offset, storing the instruction in `instruction` and the offset wanted into `relative_address` (PRES_RELATIVE_ADDRESS) 4) An instruction that requires no further processing, storing the instruction into `instruction` (PRES_COMPLETE_INSTRUCTION) In the processing stage, we resolve all calls by iterating one by one and maintaining an absolute instruction address. Pretty nice, lots more machinery involved in parsing now. --- asm/parser.h | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'asm/parser.h') diff --git a/asm/parser.h b/asm/parser.h index ee12b40..0a65310 100644 --- a/asm/parser.h +++ b/asm/parser.h @@ -27,11 +27,28 @@ typedef enum PERR_EXPECTED_SYMBOL, PERR_EXPECTED_OPERAND, PERR_UNKNOWN_OPERATOR, + PERR_INVALID_RELATIVE_ADDRESS, + PERR_UNKNOWN_LABEL, } perr_t; const char *perr_as_cstr(perr_t); -perr_t parse_next_inst(token_stream_t *, inst_t *); +typedef struct +{ + inst_t instruction; + char *label; + s_word relative_address; + enum PResult_Type + { + PRES_LABEL = 0, + PRES_LABEL_ADDRESS, + PRES_RELATIVE_ADDRESS, + PRES_COMPLETE_RESULT, + } type; +} presult_t; + +perr_t parse_next(token_stream_t *, presult_t *); +perr_t process_presults(presult_t *, size_t, inst_t **, size_t *); perr_t parse_stream(token_stream_t *, inst_t **, size_t *); #endif -- cgit v1.2.3-13-gbd6f