commit a987479617dd333353f22b67f2637df5e7ed4486 (tree)
parent 2a56ea9be26bb3bbadc9850b8abfb45f2917153c
Author: Motiejus Jakštys <motiejus@jakstys.lt>
Date: Wed, 8 Jan 2025 18:35:04 +0100
beginning of parseVarDeclProto
Diffstat:
| M | .clang-format | | | 1 | + |
| M | parser.c | | | 112 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- |
2 files changed, 103 insertions(+), 10 deletions(-)
diff --git a/.clang-format b/.clang-format
@@ -1,2 +1,3 @@
BasedOnStyle: WebKit
BreakBeforeBraces: Attach
+ColumnLimit: 80
diff --git 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) {