68 lines
1.7 KiB
C
68 lines
1.7 KiB
C
#include "parser.h"
|
|
#include "type.h"
|
|
#include "ast/ast.h"
|
|
|
|
int poptok(struct Parser* parser) {
|
|
if (parser->size == 0) {
|
|
return -1;
|
|
}
|
|
int idx = parser->cur_idx;
|
|
parser->cur_idx = (idx + 1) % PARSER_MAX_TOKEN_QUEUE;
|
|
parser->size--;
|
|
return 0;
|
|
}
|
|
|
|
void flushpeektok(struct Parser* parser) {
|
|
parser->peek_idx = parser->cur_idx;
|
|
}
|
|
|
|
struct Token* peektok(struct Parser* parser) {
|
|
int idx = parser->peek_idx;
|
|
idx = (idx + 1) % PARSER_MAX_TOKEN_QUEUE;
|
|
if (parser->size >= PARSER_MAX_TOKEN_QUEUE) {
|
|
warn("peek maybe too deep");
|
|
}
|
|
if (parser->peek_idx == parser->end_idx) {
|
|
if (parser->size == PARSER_MAX_TOKEN_QUEUE) {
|
|
// FIXME
|
|
error("buffer overflow");
|
|
}
|
|
get_valid_token(parser->lexer, &(parser->TokenBuffer[idx]));
|
|
parser->size++;
|
|
parser->end_idx = idx;
|
|
}
|
|
|
|
parser->peek_idx = idx;
|
|
return &(parser->TokenBuffer[idx]);
|
|
}
|
|
|
|
enum TokenType peektoktype(struct Parser* parser) {
|
|
return peektok(parser)->type;
|
|
}
|
|
|
|
void expecttok(struct Parser* parser, enum TokenType type) {
|
|
struct Token* tok = peektok(parser);
|
|
if (tok->type != type) {
|
|
error("expected tok: %s, got %s", get_token_name(type), get_token_name(tok->type));
|
|
} else {
|
|
poptok(parser);
|
|
}
|
|
}
|
|
|
|
void init_parser(struct Parser* parser, struct Lexer* lexer, struct SymbolTable* symtab) {
|
|
parser->cur_node = NULL;
|
|
parser->root = NULL;
|
|
|
|
parser->cur_idx = 0;
|
|
parser->peek_idx = 0;
|
|
parser->end_idx = 0;
|
|
parser->size = 0;
|
|
parser->lexer = lexer;
|
|
parser->symtab = symtab;
|
|
// TODO
|
|
}
|
|
|
|
void run_parser(struct Parser* parser) {
|
|
parse_prog(parser);
|
|
}
|