aboutsummaryrefslogtreecommitdiff
path: root/asm/parser.h
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2023-11-02 20:31:55 +0000
committerAryadev Chavali <aryadev@aryadevchavali.com>2023-11-02 20:31:55 +0000
commit4990d93a1c333c032e5ee0f1fc4aa3a02a7d41fc (patch)
tree39a1d0bf5c89de639b45c779cc0a3bbeb09d2a87 /asm/parser.h
parentd5e311c9d44793d269e9b8ee5e8c0fa7a1a25a50 (diff)
downloadovm-4990d93a1c333c032e5ee0f1fc4aa3a02a7d41fc.tar.gz
ovm-4990d93a1c333c032e5ee0f1fc4aa3a02a7d41fc.tar.bz2
ovm-4990d93a1c333c032e5ee0f1fc4aa3a02a7d41fc.zip
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.
Diffstat (limited to 'asm/parser.h')
-rw-r--r--asm/parser.h19
1 files changed, 18 insertions, 1 deletions
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