diff options
| author | Mustafa Quraish <[email protected]> | 2022-01-28 18:45:18 -0500 |
|---|---|---|
| committer | Mustafa Quraish <[email protected]> | 2022-01-28 22:38:02 -0500 |
| commit | 0874e5e5440c802415291c8f3d5ec040167445eb (patch) | |
| tree | a3a27e521ba1e896e517d47ba98fca1d69fa980f /cup/parser.c | |
| parent | Add some scripts to help assemble generated output and run it (diff) | |
| download | archived-cup-0874e5e5440c802415291c8f3d5ec040167445eb.tar.xz archived-cup-0874e5e5440c802415291c8f3d5ec040167445eb.zip | |
Lexer+Parser: Add support for some unary operations
Diffstat (limited to 'cup/parser.c')
| -rw-r--r-- | cup/parser.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/cup/parser.c b/cup/parser.c index 0d0ce46..746a139 100644 --- a/cup/parser.c +++ b/cup/parser.c @@ -50,17 +50,38 @@ Type parse_type(Lexer *lexer) return type; } -Node *parse_expression(Lexer *lexer) +Node *parse_literal(Lexer *lexer) { - // TODO: Parse more complicated things - Token token; Node *node = Node_new(AST_LITERAL); - token = assert_token(Lexer_next(lexer), TOKEN_INTLIT); + Token token = assert_token(Lexer_next(lexer), TOKEN_INTLIT); node->literal.type = (Type) {.type = TYPE_INT}; node->literal.as_int = token.value.as_int; return node; } +Node *parse_expression(Lexer *lexer) +{ + // TODO: Parse more complicated things + Token token = Lexer_peek(lexer); + Node *expr; + if (token.type == TOKEN_MINUS) { + Lexer_next(lexer); + expr = Node_new(OP_NEG); + expr->unary_expr = parse_expression(lexer); + } else if (token.type == TOKEN_TILDE) { + Lexer_next(lexer); + expr = Node_new(OP_BWINV); + expr->unary_expr = parse_expression(lexer); + } else if (token.type == TOKEN_EXCLAMATION) { + Lexer_next(lexer); + expr = Node_new(OP_NOT); + expr->unary_expr = parse_expression(lexer); + } else { + return parse_literal(lexer); + } + return expr; +} + Node *parse_statement(Lexer *lexer) { Node *node; |