From a987479617dd333353f22b67f2637df5e7ed4486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= Date: Wed, 8 Jan 2025 18:35:04 +0100 Subject: [PATCH] beginning of parseVarDeclProto --- .clang-format | 1 + parser.c | 112 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 103 insertions(+), 10 deletions(-) diff --git a/.clang-format b/.clang-format index d1078a7..3aff6ad 100644 --- a/.clang-format +++ b/.clang-format @@ -1,2 +1,3 @@ BasedOnStyle: WebKit BreakBeforeBraces: Attach +ColumnLimit: 80 diff --git a/parser.c b/parser.c index 2eedf77..5c4244f 100644 --- a/parser.c +++ b/parser.c @@ -508,8 +508,109 @@ static AstNodeIndex parseAssignExpr(Parser* p) { return 0; // tcc } +static AstNodeIndex parseVarDeclProto(Parser* p) { + if (eatToken(p, TOKEN_KEYWORD_CONST) == null_token || eatToken(p, TOKEN_KEYWORD_VAR) == null_token) + return null_node; + + fprintf(stderr, "parseVarDeclProto: parsing vars is not supported\n"); + exit(1); + return 0; // tcc +} + +typedef struct { + int8_t prec; + AstNodeTag tag; + enum { + ASSOC_LEFT, + ASSOC_NONE, + } assoc; +} OperInfo; + +static OperInfo operTable(TokenizerTag tok_tag) { + switch (tok_tag) { + case TOKEN_KEYWORD_OR: + return (OperInfo) { .prec = 10, .tag = AST_NODE_BOOL_OR }; + case TOKEN_KEYWORD_AND: + return (OperInfo) { .prec = 20, .tag = AST_NODE_BOOL_AND }; + + case TOKEN_EQUAL_EQUAL: + return (OperInfo) { .prec = 30, .tag = AST_NODE_EQUAL_EQUAL, .assoc = ASSOC_NONE }; + case TOKEN_BANG_EQUAL: + return (OperInfo) { .prec = 30, .tag = AST_NODE_BANG_EQUAL, .assoc = ASSOC_NONE }; + case TOKEN_ANGLE_BRACKET_LEFT: + return (OperInfo) { .prec = 30, .tag = AST_NODE_LESS_THAN, .assoc = ASSOC_NONE }; + case TOKEN_ANGLE_BRACKET_RIGHT: + return (OperInfo) { .prec = 30, .tag = AST_NODE_GREATER_THAN, .assoc = ASSOC_NONE }; + case TOKEN_ANGLE_BRACKET_LEFT_EQUAL: + return (OperInfo) { .prec = 30, .tag = AST_NODE_LESS_OR_EQUAL, .assoc = ASSOC_NONE }; + case TOKEN_ANGLE_BRACKET_RIGHT_EQUAL: + return (OperInfo) { .prec = 30, .tag = AST_NODE_GREATER_OR_EQUAL, .assoc = ASSOC_NONE }; + + case TOKEN_AMPERSAND: + return (OperInfo) { .prec = 40, .tag = AST_NODE_BIT_AND }; + case TOKEN_CARET: + return (OperInfo) { .prec = 40, .tag = AST_NODE_BIT_XOR }; + case TOKEN_PIPE: + return (OperInfo) { .prec = 40, .tag = AST_NODE_BIT_OR }; + case TOKEN_KEYWORD_ORELSE: + return (OperInfo) { .prec = 40, .tag = AST_NODE_ORELSE }; + case TOKEN_KEYWORD_CATCH: + return (OperInfo) { .prec = 40, .tag = AST_NODE_CATCH }; + + case TOKEN_ANGLE_BRACKET_ANGLE_BRACKET_LEFT: + return (OperInfo) { .prec = 50, .tag = AST_NODE_SHL }; + case TOKEN_ANGLE_BRACKET_ANGLE_BRACKET_LEFT_PIPE: + return (OperInfo) { .prec = 50, .tag = AST_NODE_SHL_SAT }; + case TOKEN_ANGLE_BRACKET_ANGLE_BRACKET_RIGHT: + return (OperInfo) { .prec = 50, .tag = AST_NODE_SHR }; + + case TOKEN_PLUS: + return (OperInfo) { .prec = 60, .tag = AST_NODE_ADD }; + case TOKEN_MINUS: + return (OperInfo) { .prec = 60, .tag = AST_NODE_SUB }; + case TOKEN_PLUS_PLUS: + return (OperInfo) { .prec = 60, .tag = AST_NODE_ARRAY_CAT }; + case TOKEN_PLUS_PERCENT: + return (OperInfo) { .prec = 60, .tag = AST_NODE_ADD_WRAP }; + case TOKEN_MINUS_PERCENT: + return (OperInfo) { .prec = 60, .tag = AST_NODE_SUB_WRAP }; + case TOKEN_PLUS_PIPE: + return (OperInfo) { .prec = 60, .tag = AST_NODE_ADD_SAT }; + case TOKEN_MINUS_PIPE: + return (OperInfo) { .prec = 60, .tag = AST_NODE_SUB_SAT }; + + case TOKEN_PIPE_PIPE: + return (OperInfo) { .prec = 70, .tag = AST_NODE_MERGE_ERROR_SETS }; + case TOKEN_ASTERISK: + return (OperInfo) { .prec = 70, .tag = AST_NODE_MUL }; + case TOKEN_SLASH: + return (OperInfo) { .prec = 70, .tag = AST_NODE_DIV }; + case TOKEN_PERCENT: + return (OperInfo) { .prec = 70, .tag = AST_NODE_MOD }; + case TOKEN_ASTERISK_ASTERISK: + return (OperInfo) { .prec = 70, .tag = AST_NODE_ARRAY_MULT }; + case TOKEN_ASTERISK_PERCENT: + return (OperInfo) { .prec = 70, .tag = AST_NODE_MUL_WRAP }; + case TOKEN_ASTERISK_PIPE: + return (OperInfo) { .prec = 70, .tag = AST_NODE_MUL_SAT }; + + default: + return (OperInfo) { .prec = -1, .tag = AST_NODE_ROOT }; + } +} + static AstNodeIndex expectVarDeclExprStatement(Parser* p) { - (void)p; + CleanupScratch scratch_top __attribute__((__cleanup__(cleanupScratch))) = initCleanupScratch(p); + + // while(true) { + // const AstNodeIndex var_decl_proto = parseVarDeclProto(p); + // if (var_decl_proto != 0) { + // SLICE_APPEND(AstNodeIndex, &p->scratch, var_decl_proto); + // } else { + + // } + //} + fprintf(stderr, "expectVarDeclExprStatement not implemented\n"); exit(1); return 0; // tcc @@ -639,15 +740,6 @@ static AstNodeIndex parseLabeledStatement(Parser* p) { return null_node; } -static AstNodeIndex parseVarDeclProto(Parser* p) { - if (eatToken(p, TOKEN_KEYWORD_CONST) == null_token || eatToken(p, TOKEN_KEYWORD_VAR) == null_token) - return null_node; - - fprintf(stderr, "parseVarDeclProto: parsing vars is not supported\n"); - exit(1); - return 0; // tcc -} - static AstNodeIndex parseGlobalVarDecl(Parser* p) { const AstNodeIndex var_decl = parseVarDeclProto(p); if (var_decl == 0) {