beginning of parseVarDeclProto

This commit is contained in:
2025-01-08 18:35:04 +01:00
parent 2a56ea9be2
commit a987479617
2 changed files with 103 additions and 10 deletions

View File

@@ -1,2 +1,3 @@
BasedOnStyle: WebKit BasedOnStyle: WebKit
BreakBeforeBraces: Attach BreakBeforeBraces: Attach
ColumnLimit: 80

112
parser.c
View File

@@ -508,8 +508,109 @@ static AstNodeIndex parseAssignExpr(Parser* p) {
return 0; // tcc 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) { 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"); fprintf(stderr, "expectVarDeclExprStatement not implemented\n");
exit(1); exit(1);
return 0; // tcc return 0; // tcc
@@ -639,15 +740,6 @@ static AstNodeIndex parseLabeledStatement(Parser* p) {
return null_node; 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) { static AstNodeIndex parseGlobalVarDecl(Parser* p) {
const AstNodeIndex var_decl = parseVarDeclProto(p); const AstNodeIndex var_decl = parseVarDeclProto(p);
if (var_decl == 0) { if (var_decl == 0) {