feat: implement lexer+parser for example program
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
#ifndef FZL_PARSER_H
|
||||
#define FZL_PARSER_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include <compiler/fzl_token.h>
|
||||
#include <compiler/fzl_reader.h>
|
||||
|
||||
// AST node type
|
||||
typedef enum {
|
||||
FZL_NODETYPE_BLOCK,
|
||||
FZL_NODETYPE_CALL,
|
||||
FZL_NODETYPE_LITERAL,
|
||||
} fzl_nodetype_t;
|
||||
|
||||
// AST node descriptor
|
||||
typedef struct fzl_node {
|
||||
fzl_nodetype_t type;
|
||||
fzl_token_t *token;
|
||||
struct fzl_node *parent;
|
||||
struct fzl_node *next;
|
||||
|
||||
union {
|
||||
struct {
|
||||
struct fzl_node **entries;
|
||||
size_t entry_count;
|
||||
} list;
|
||||
};
|
||||
} fzl_node_t;
|
||||
|
||||
// Token sequence parser descriptor
|
||||
typedef struct {
|
||||
fzl_reader_ll_t *first;
|
||||
size_t token_count;
|
||||
|
||||
fzl_reader_ll_t *cursor;
|
||||
fzl_node_t *root;
|
||||
} fzl_parser_t;
|
||||
|
||||
// Allocate parser
|
||||
fzl_parser_t *fzl_mkparser(fzl_reader_ll_t *first);
|
||||
|
||||
// Allocate new node
|
||||
fzl_node_t *fzl_mknode(fzl_nodetype_t type, fzl_token_t *tok);
|
||||
|
||||
// Parse tokens
|
||||
int fzl_parse(fzl_parser_t *parser);
|
||||
|
||||
// Get last parser error
|
||||
char *fzl_parser_geterror();
|
||||
|
||||
// Free node
|
||||
void fzl_freenode(fzl_node_t* node);
|
||||
|
||||
// Free parser
|
||||
void fzl_freeparser(fzl_parser_t *parser);
|
||||
|
||||
#endif//FZL_PARSER_H
|
||||
|
||||
Reference in New Issue
Block a user