ea55dedd07
- Split ast.h into granular headers in v0/ast/ - Split parser.c into modular implementation files in v0/parser/ - Move and rename parser tests to v0/parser/test_*.c - Update build system (include.mk) with modular sub-makefiles - Maintain v0/ast.h and v0/parser.h as umbrella headers
53 lines
1.2 KiB
C
53 lines
1.2 KiB
C
#include "internal.h"
|
|
#include "../str.h"
|
|
#include "../log.h"
|
|
#include <stdlib.h>
|
|
|
|
void parser_next_token(Parser* p) {
|
|
p->token = tokenstream_next(p->ts);
|
|
}
|
|
|
|
bool parser_accept(Parser* p, TokenType token) {
|
|
if (p->token.token == token) {
|
|
parser_next_token(p);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool parser_expect(Parser* p, TokenType token, const char* msg) {
|
|
if (parser_accept(p, token)) {
|
|
return true;
|
|
}
|
|
log_on_line(&p->token.location, msg);
|
|
return false;
|
|
}
|
|
|
|
bool parser_peek(Parser* p, TokenType token) {
|
|
if (p->token.token == token) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool parser_require(Parser* p, TokenType token, const char* msg) {
|
|
if (parser_peek(p, token)) {
|
|
return true;
|
|
}
|
|
log_on_line(&p->token.location, msg);
|
|
return false;
|
|
}
|
|
|
|
char* parser_to_text(Parser* p) {
|
|
char* str = string_copy(p->token.text);
|
|
parser_next_token(p);
|
|
return str;
|
|
}
|
|
|
|
bool parser_accept_primitive(Parser* p) {
|
|
return parser_peek(p, TOKEN_I8) || parser_peek(p, TOKEN_I16) ||
|
|
parser_peek(p, TOKEN_I32) || parser_peek(p, TOKEN_I64) ||
|
|
parser_peek(p, TOKEN_U8) || parser_peek(p, TOKEN_U16) ||
|
|
parser_peek(p, TOKEN_U32) || parser_peek(p, TOKEN_U64);
|
|
}
|