178 lines
3.1 KiB
C
178 lines
3.1 KiB
C
#ifndef FZL_PARSER_H
|
|
#define FZL_PARSER_H
|
|
|
|
#include <compiler/fzl_reader.h>
|
|
#include <compiler/fzl_token.h>
|
|
#include <stddef.h>
|
|
|
|
// AST node type
|
|
typedef enum
|
|
{
|
|
FZL_NODETYPE_BLOCK,
|
|
FZL_NODETYPE_CALL,
|
|
FZL_NODETYPE_LITERAL,
|
|
FZL_NODETYPE_IDENTIFIER,
|
|
FZL_NODETYPE_CONDITIONAL,
|
|
FZL_NODETYPE_FUNCTION,
|
|
FZL_NODETYPE_RETURN,
|
|
FZL_NODETYPE_CLASS,
|
|
FZL_NODETYPE_FIELD,
|
|
FZL_NODETYPE_CONSTRUCT,
|
|
|
|
FZL_NODETYPE_ADD,
|
|
FZL_NODETYPE_SUB,
|
|
FZL_NODETYPE_MUL,
|
|
FZL_NODETYPE_DIV,
|
|
FZL_NODETYPE_POW,
|
|
FZL_NODETYPE_MOD,
|
|
|
|
FZL_NODETYPE_UNARY_PLUS,
|
|
FZL_NODETYPE_UNARY_MINUS,
|
|
|
|
FZL_NODETYPE_OR,
|
|
FZL_NODETYPE_AND,
|
|
|
|
FZL_NODETYPE_EQUAL,
|
|
FZL_NODETYPE_NEQUAL,
|
|
FZL_NODETYPE_LESS,
|
|
FZL_NODETYPE_LESS_EQUAL,
|
|
FZL_NODETYPE_GREATER,
|
|
FZL_NODETYPE_GREATER_EQUAL,
|
|
|
|
FZL_NODETYPE_NOT,
|
|
|
|
FZL_NODETYPE_DECLARATION,
|
|
FZL_NODETYPE_ASSIGN
|
|
} 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
|
|
{
|
|
// Array of nested nodes (for blocks, etc)
|
|
struct
|
|
{
|
|
struct fzl_node **entries;
|
|
size_t entry_count;
|
|
} list;
|
|
|
|
// Call data
|
|
struct
|
|
{
|
|
struct fzl_node *callee;
|
|
|
|
struct fzl_node **args;
|
|
size_t args_count;
|
|
} call;
|
|
|
|
// Binary operations
|
|
struct
|
|
{
|
|
struct fzl_node *left;
|
|
struct fzl_node *right;
|
|
} binary_op;
|
|
|
|
// Unary operations
|
|
struct
|
|
{
|
|
struct fzl_node *operand;
|
|
} unary_op;
|
|
|
|
// Variables declaration and initializing
|
|
struct
|
|
{
|
|
fzl_token_t *type;
|
|
struct fzl_node *identifier;
|
|
} var;
|
|
|
|
// Conditional blocks
|
|
struct
|
|
{
|
|
struct fzl_node *condition;
|
|
struct fzl_node *true_block;
|
|
struct fzl_node *else_block;
|
|
} cond;
|
|
|
|
// Function declaration
|
|
struct
|
|
{
|
|
struct fzl_node **args;
|
|
size_t args_count;
|
|
|
|
struct fzl_node *body;
|
|
fzl_token_t *name;
|
|
fzl_token_t *type;
|
|
} fn;
|
|
|
|
// Return value
|
|
struct
|
|
{
|
|
struct fzl_node *value;
|
|
} ret;
|
|
|
|
// Class declaration
|
|
struct
|
|
{
|
|
fzl_token_t *name;
|
|
|
|
struct fzl_node **fields;
|
|
size_t fields_count;
|
|
|
|
struct fzl_node **methods;
|
|
size_t methods_count;
|
|
} class;
|
|
|
|
// Member access
|
|
struct
|
|
{
|
|
struct fzl_node *parent;
|
|
struct fzl_node *field;
|
|
} memb;
|
|
|
|
// Object construct
|
|
struct
|
|
{
|
|
struct fzl_node *name;
|
|
} construct;
|
|
};
|
|
} 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 entire AST going from root node
|
|
void fzl_freeast(fzl_node_t *root);
|
|
|
|
// Free parser
|
|
void fzl_freeparser(fzl_parser_t *parser);
|
|
|
|
#endif // FZL_PARSER_H
|