From 38e5cd06faed911efb6bc354fa46ff70b198a5f3 Mon Sep 17 00:00:00 2001 From: sBubshait Date: Thu, 13 Jun 2024 17:23:30 +0100 Subject: [PATCH] Add tokeniser.c to make parsing easier --- src/add_imm_sh.s | 3 ++ src/tokeniser.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 src/add_imm_sh.s create mode 100644 src/tokeniser.c diff --git a/src/add_imm_sh.s b/src/add_imm_sh.s new file mode 100644 index 0000000..8271daa --- /dev/null +++ b/src/add_imm_sh.s @@ -0,0 +1,3 @@ +add x0, x0, #1, lsl #12 + +and x0, x0, x0 diff --git a/src/tokeniser.c b/src/tokeniser.c new file mode 100644 index 0000000..1bb2fe5 --- /dev/null +++ b/src/tokeniser.c @@ -0,0 +1,103 @@ +// Tokeniser.c +#include +#include +#include +#include +#include + +#define MAX_TOKEN_COUNT 5 +#define MAX_OPERAND_COUNT 4 +#define OPERAND_DELIMITER ", " + +char **tokenise(char *line, int *numTokens) { + char **tokens = malloc(MAX_TOKEN_COUNT * sizeof(char *));\ + if (!tokens) { + fprintf(stderr, "Memory allocation failed\n"); + exit(EXIT_FAILURE); + } + + *numTokens = 0; + char *token = strtok(line, " "); + assert(token != NULL); + + tokens[(*numTokens)++] = token; + + char *operandStart = strtok(NULL, ""); + assert(operandStart != NULL); + + bool inBracket = false; + char *currentToken = operandStart; + + for (char *c = operandStart; *c != '\0'; ++c) { + if (*c == '[' || *c == '{') { + inBracket = true; + } else if (*c == ']' || *c == '}') { + inBracket = false; + } + + + if (*c == ',' && !inBracket) { + *c = '\0'; + tokens[(*numTokens)++] = currentToken; + currentToken = c + 2; // Skip ", " + } + } + + if (*currentToken != '\0') { + tokens[*numTokens] = currentToken; + + if (tokens[*numTokens][strlen(tokens[*numTokens]) - 1] == '\n') { + tokens[*numTokens][strlen(tokens[*numTokens]) - 1] = '\0'; + } + + (*numTokens)++; + } + + return tokens; +} + +char **tokeniseOperands(char *line, int *numTokens) { + char **tokens = malloc(MAX_OPERAND_COUNT * sizeof(char *)); + if (!tokens) { + fprintf(stderr, "Memory allocation failed\n"); + exit(EXIT_FAILURE); + } + + if (*line == '[') { + line++; // skip '[' + line[strlen(line) - 1] = '\0'; // remove ']' + } else if (*line == '{') { + line++; // skip '{' + line[strlen(line) - 1] = '\0'; // remove '}' + } + + *numTokens = 0; + bool inBracket = false; + char *currentToken = line; + + for (char *c = line; *c != '\0'; ++c) { + if (*c == '[' || *c == '{') { + inBracket = true; + } else if (*c == ']' || *c == '}') { + inBracket = false; + } + + if (*c == ',' && !inBracket) { + *c = '\0'; + tokens[(*numTokens)++] = currentToken; + currentToken = c + 2; // Skip ", " + } + } + + if (*currentToken != '\0') { + tokens[*numTokens] = currentToken; + + if (tokens[*numTokens][strlen(tokens[*numTokens]) - 1] == '\n') { + tokens[*numTokens][strlen(tokens[*numTokens]) - 1] = '\0'; + } + + (*numTokens)++; + } + + return tokens; +}