# HG changeset patch # User Michael Pavone # Date 1659823387 25200 # Node ID 4b47155965c8f31b6c98212573367a4184cf0397 # Parent ada3130b13969d034e7c3aef56b48f8042725b41 Implement parentheses in debugger parser diff -r ada3130b1396 -r 4b47155965c8 debug.c --- 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);