summaryrefslogtreecommitdiff
path: root/bu-parser.c
diff options
context:
space:
mode:
authorPedro Souza <pedro@masba.net>2024-04-03 07:27:36 -0300
committerPedro Souza <pedro@masba.net>2024-04-03 07:27:36 -0300
commitc5921aec313cefa8bd6e8f4c70f057c137133028 (patch)
treed89973053a228b4d0973796e80a1063ec4999475 /bu-parser.c
parent131dfc5e9f810b1c1e1fb1d75e781842ec601a65 (diff)
add parethesis support
Diffstat (limited to 'bu-parser.c')
-rw-r--r--bu-parser.c24
1 files changed, 18 insertions, 6 deletions
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 <stdio.h>
-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;
}
}