beginning of parseVarDeclProto
This commit is contained in:
@@ -1,2 +1,3 @@
|
||||
BasedOnStyle: WebKit
|
||||
BreakBeforeBraces: Attach
|
||||
ColumnLimit: 80
|
||||
|
||||
112
parser.c
112
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) {
|
||||
|
||||
Reference in New Issue
Block a user