bool parser_check_token(Parser *p, const Token_type t);
Token parser_advance(Parser *p);
Token parser_previous(Parser *p);
+Token parser_peek_by(Parser *p, size_t by);
Token parser_peek(Parser *p);
bool parser_eof(Parser *p);
void free_parser(Parser *p);
case LIT_BOOL: return "BOOL";
case LIT_CHAR: return "CHAR";
case LIT_STRING: return "STRING";
- case LIT_COUNT:
+ case LIT_COUNT:
default: ASSERT(false, "UNREACHABLE!");
}
return "YOU SHOULD NOT SEE THIS!";
}
Token parser_advance(Parser *p) {
- if (!parser_eof(p)) {
+ if (!parser_eof(p)) {
p->current_token_id += 1;
}
return parser_previous(p);
return p->tokens.items[p->current_token_id-1];
}
+
+Token parser_peek_by(Parser *p, size_t by) {
+ ASSERT(0 <= (int)(p->current_token_id+by) && (size_t)(p->current_token_id+by) <= p->tokens.count-1, "OutofBounds");
+ return p->tokens.items[p->current_token_id+by];
+}
+
Token parser_peek(Parser *p) {
- ASSERT(0 <= p->current_token_id && (size_t)p->current_token_id <= p->tokens.count-1, "OutofBounds");
- return p->tokens.items[p->current_token_id];
+ return parser_peek_by(p, 0);
}
bool parser_eof(Parser *p) {
l->cur += string_sv_out->count;
if (eof(l)) {
- error_pretty((*loc_out), (*l), "Unterminated string!");
+ error_pretty((*loc_out), (*l), "Unterminated string!");
exit(1);
}
exit(1);
}
if (eof(l)) {
- error_pretty(*loc_out, *l, "Unterminated char!");
+ error_pretty(*loc_out, *l, "Unterminated char!");
exit(1);
}
// NOTE: We can do this because dot_sv and float_sv is right after sv_out!
sv_out->count += dot_sv.count + float_sv.count;
}
-
+
// Advance by the len of sv
l->cur += sv_out->count;
}
char next = next_char(l);
switch (next) {
- case '*':
+ case '*':
case '/': {
String_view comment_sv = {0};
Location comment_loc = {0};