aboutsummaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c54
1 files changed, 19 insertions, 35 deletions
diff --git a/src/parser.c b/src/parser.c
index 6afc807af..4223c36fe 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1096,6 +1096,7 @@ AstNode *make_import_decl(AstFile *f, Token token, bool is_import, Token relpath
bool next_token(AstFile *f) {
+ Token prev = f->curr_token;
if (f->curr_token_index+1 < f->tokens.count) {
if (f->curr_token.kind != Token_Comment) {
f->prev_token = f->curr_token;
@@ -1959,8 +1960,8 @@ AstNode *parse_unary_expr(AstFile *f, bool lhs) {
}
// NOTE(bill): result == priority
-i32 token_precedence(Token t) {
- switch (t.kind) {
+i32 token_precedence(TokenKind t) {
+ switch (t) {
case Token_CmpOr:
return 1;
case Token_CmpAnd:
@@ -1996,11 +1997,11 @@ i32 token_precedence(Token t) {
AstNode *parse_binary_expr(AstFile *f, bool lhs, i32 prec_in) {
AstNode *expression = parse_unary_expr(f, lhs);
- for (i32 prec = token_precedence(f->curr_token); prec >= prec_in; prec--) {
+ for (i32 prec = token_precedence(f->curr_token.kind); prec >= prec_in; prec--) {
for (;;) {
AstNode *right;
Token op = f->curr_token;
- i32 op_prec = token_precedence(op);
+ i32 op_prec = token_precedence(op.kind);
if (op_prec != prec) {
break;
}
@@ -2293,35 +2294,22 @@ AstNode *parse_var_type(AstFile *f, bool allow_ellipsis) {
u32 parse_field_prefixes(AstFile *f) {
- i32 using_count = 0;
- i32 no_alias_count = 0;
+ i32 using_count = 0;
+ i32 no_alias_count = 0;
i32 immutable_count = 0;
- while (f->curr_token.kind == Token_using ||
- f->curr_token.kind == Token_no_alias ||
- f->curr_token.kind == Token_immutable) {
- if (allow_token(f, Token_using)) {
- using_count += 1;
- }
- if (allow_token(f, Token_no_alias)) {
- no_alias_count += 1;
- }
- if (allow_token(f, Token_immutable)) {
- immutable_count += 1;
+ bool loop = true;
+ while (loop) {
+ switch (f->curr_token.kind) {
+ default: loop = false; break;
+ case Token_using: using_count += 1; next_token(f); break;
+ case Token_no_alias: no_alias_count += 1; next_token(f); break;
+ case Token_immutable: immutable_count += 1; next_token(f); break;
}
}
- if (using_count > 1) {
- syntax_error(f->curr_token, "Multiple `using` in this field list");
- using_count = 1;
- }
- if (no_alias_count > 1) {
- syntax_error(f->curr_token, "Multiple `no_alias` in this field list");
- no_alias_count = 1;
- }
- if (immutable_count > 1) {
- syntax_error(f->curr_token, "Multiple `immutable` in this field list");
- immutable_count = 1;
- }
+ if (using_count > 1) syntax_error(f->curr_token, "Multiple `using` in this field list");
+ if (no_alias_count > 1) syntax_error(f->curr_token, "Multiple `no_alias` in this field list");
+ if (immutable_count > 1) syntax_error(f->curr_token, "Multiple `immutable` in this field list");
u32 field_flags = 0;
@@ -3095,16 +3083,14 @@ AstNode *parse_stmt(AstFile *f) {
case AstNode_ValueDecl:
if (!node->ValueDecl.is_var) {
syntax_error(token, "`using` may not be applied to constant declarations");
- return make_bad_stmt(f, token, f->curr_token);
} else {
if (f->curr_proc == NULL) {
syntax_error(token, "`using` is not allowed at the file scope");
} else {
node->ValueDecl.flags |= VarDeclFlag_using;
}
- return node;
}
- break;
+ return node;
case AstNode_ExprStmt: {
AstNode *e = unparen_expr(node->ExprStmt.expr);
while (e->kind == AstNode_SelectorExpr) {
@@ -3127,11 +3113,10 @@ AstNode *parse_stmt(AstFile *f) {
if (node->kind == AstNode_ValueDecl) {
if (!node->ValueDecl.is_var) {
syntax_error(token, "`immutable` may not be applied to constant declarations");
- return make_bad_stmt(f, token, f->curr_token);
} else {
node->ValueDecl.flags |= VarDeclFlag_immutable;
- return node;
}
+ return node;
}
syntax_error(token, "`immutable` may only be applied to a variable declaration");
return make_bad_stmt(f, token, f->curr_token);
@@ -3144,7 +3129,6 @@ AstNode *parse_stmt(AstFile *f) {
if (node->kind == AstNode_ValueDecl) {
if (!node->ValueDecl.is_var) {
syntax_error(token, "`thread_local` may not be applied to constant declarations");
- return make_bad_stmt(f, token, f->curr_token);
}
if (f->curr_proc != NULL) {
syntax_error(token, "`thread_local` is only allowed at the file scope");