From c5921aec313cefa8bd6e8f4c70f057c137133028 Mon Sep 17 00:00:00 2001 From: Pedro Souza Date: Wed, 3 Apr 2024 07:27:36 -0300 Subject: add parethesis support --- bu-parser.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'bu-parser.c') diff --git a/bu-parser.c b/bu-parser.c index b077938..df4c2c2 100644 --- a/bu-parser.c +++ b/bu-parser.c @@ -2,12 +2,6 @@ #include "tree.h" #include -void free_node(node *n) { - if (n->lhs) free_node(n->lhs); - if (n->rhs) free_node(n->rhs); - free(n); -} - void fprint_stack(FILE *stream, struct expr_parser *ep) { for (size_t i = 0; i < ep->stack_idx; i++) { struct stackmember m = ep->stack[i]; @@ -132,6 +126,20 @@ void unary_expr(struct expr_parser *ep) { ep->stack[ep->stack_idx - 1] = newm; } +void parens_expr(struct expr_parser *ep) { + struct stackmember o, e, c; + o = stack_pos(ep, 2); + e = stack_pos(ep, 1); + c = stack_pos(ep, 0); + BAIL_REDUCE_IF( + o.id != TOKEN_OPEN_PAREN + || e.id != STACKMEMBER_EXPR + || c.id != TOKEN_CLOSE_PAREN, "mismatched parenthesis"); + + ep->stack_idx -= 2; + ep->stack[ep->stack_idx - 1] = e; +} + int expr_parser_run(struct expr_parser *ep) { // prime the look-ahead ep->lahead = ep->lex(ep->lex_data); @@ -167,6 +175,10 @@ int expr_parser_run(struct expr_parser *ep) { } } break; + case TOKEN_CLOSE_PAREN: + parens_expr(ep); + noshift = 1; + break; default: break; } } -- cgit v1.2.3