feat add func call and rewrite codes
This commit is contained in:
@@ -1,67 +1,17 @@
|
||||
#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) {
|
||||
void init_parser(parser_t* parser, lexer_t* lexer, symtab_t* 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
|
||||
init_tokbuf(&parser->tokbuf, lexer, (get_tokbuf_func)get_valid_token);
|
||||
parser->tokbuf.cap = sizeof(parser->TokenBuffer) / sizeof(parser->TokenBuffer[0]);
|
||||
parser->tokbuf.buf = parser->TokenBuffer;
|
||||
}
|
||||
|
||||
void run_parser(struct Parser* parser) {
|
||||
void run_parser(parser_t* parser) {
|
||||
parse_prog(parser);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user