36 lines
791 B
C
36 lines
791 B
C
#include "parser.h"
|
|
#include "lexer.h"
|
|
#include "assert.h"
|
|
|
|
struct token_reader {
|
|
bool have_token;
|
|
struct token token;
|
|
struct lexer_state lexer_state;
|
|
};
|
|
|
|
struct token peek(struct token_reader * reader)
|
|
{
|
|
if (reader->have_token) {
|
|
return reader->token;
|
|
} else {
|
|
reader->token = lexer_next_token(reader->lexer_state);
|
|
reader->have_token = true;
|
|
return reader->token;
|
|
}
|
|
}
|
|
|
|
struct token consume(struct token_reader * reader)
|
|
{
|
|
struct token token = peek(reader);
|
|
reader->have_token = false;
|
|
}
|
|
|
|
void expect_type(struct token_reader * reader, enum token_type token_type)
|
|
{
|
|
struct token token = consume(reader);
|
|
if (!(token->type == token_type)) {
|
|
printf("token->type=%d token_type=%d\n", token->type, token_type);
|
|
fail(token->type == token_type);
|
|
}
|
|
}
|