changeset 2171:4b47155965c8

Implement parentheses in debugger parser
author Michael Pavone <pavone@retrodev.com>
date Sat, 06 Aug 2022 15:03:07 -0700
parents ada3130b1396
children a00773a336d8
files debug.c
diffstat 1 files changed, 71 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/debug.c	Sat Aug 06 14:50:41 2022 -0700
+++ b/debug.c	Sat Aug 06 15:03:07 2022 -0700
@@ -72,6 +72,8 @@
 	TOKEN_SIZE,
 	TOKEN_LBRACKET,
 	TOKEN_RBRACKET,
+	TOKEN_LPAREN,
+	TOKEN_RPAREN
 } token_type;
 
 static const char *token_type_names[] = {
@@ -81,7 +83,9 @@
 	"TOKEN_OPER",
 	"TOKEN_SIZE",
 	"TOKEN_LBRACKET",
-	"TOKEN_RBRACKET"
+	"TOKEN_RBRACKET",
+	"TOKEN_LPAREN",
+	"TOKEN_RPAREN"
 };
 
 typedef struct {
@@ -167,6 +171,16 @@
 		return (token) {
 			.type = TOKEN_RBRACKET
 		};
+	case '(':
+		*end = start + 1;
+		return (token) {
+			.type = TOKEN_LPAREN
+		};
+	case ')':
+		*end = start + 1;
+		return (token) {
+			.type = TOKEN_RPAREN
+		};
 	}
 	*end = start + 1;
 	while (**end && !isblank(**end) && **end != '.')
@@ -265,6 +279,24 @@
 		}
 		return ret;
 	}
+	if (first.type == TOKEN_LPAREN) {
+		expr *ret = parse_expression(after_first, end);
+		if (!ret) {
+			fprintf(stderr, "Expression expected after `(`\n");
+			return NULL;
+		}
+		token rparen = parse_token(*end, end);
+		if (rparen.type != TOKEN_RPAREN) {
+			fprintf(stderr, "Missing closing `)`");
+			free_expr(ret);
+			return NULL;
+		}
+		return ret;
+	}
+	if (first.type != TOKEN_NUM && first.type != TOKEN_NAME) {
+		fprintf(stderr, "Unexpected token %s\n", token_type_names[first.type]);
+		return NULL;
+	}
 	token second = parse_token(after_first, end);
 	if (second.type != TOKEN_SIZE) {
 		expr *ret = calloc(1, sizeof(expr));
@@ -390,7 +422,25 @@
 			*end = after_size;
 			ret->op = size;
 		}
-		return ret;
+		return maybe_muldiv(ret, *end, end);
+	}
+	if (first.type == TOKEN_LPAREN) {
+		expr *ret = parse_expression(after_first, end);
+		if (!ret) {
+			fprintf(stderr, "Expression expected after `(`\n");
+			return NULL;
+		}
+		token rparen = parse_token(*end, end);
+		if (rparen.type != TOKEN_RPAREN) {
+			fprintf(stderr, "Missing closing `)`");
+			free_expr(ret);
+			return NULL;
+		}
+		return maybe_muldiv(ret, *end, end);
+	}
+	if (first.type != TOKEN_NUM && first.type != TOKEN_NAME) {
+		fprintf(stderr, "Unexpected token %s\n", token_type_names[first.type]);
+		return NULL;
 	}
 	char *after_second;
 	token second = parse_token(after_first, &after_second);
@@ -486,7 +536,25 @@
 			*end = after_size;
 			ret->op = size;
 		}
-		return ret;
+		return maybe_binary(ret, *end, end);
+	}
+	if (first.type == TOKEN_LPAREN) {
+		expr *ret = parse_expression(after_first, end);
+		if (!ret) {
+			fprintf(stderr, "Expression expected after `(`\n");
+			return NULL;
+		}
+		token rparen = parse_token(*end, end);
+		if (rparen.type != TOKEN_RPAREN) {
+			fprintf(stderr, "Missing closing `)`");
+			free_expr(ret);
+			return NULL;
+		}
+		return maybe_binary(ret, *end, end);
+	}
+	if (first.type != TOKEN_NUM && first.type != TOKEN_NAME) {
+		fprintf(stderr, "Unexpected token %s\n", token_type_names[first.type]);
+		return NULL;
 	}
 	char *after_second;
 	token second = parse_token(after_first, &after_second);