From 5ed73b695e6b463149ab0c9ae3eccb26a4ec5807 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Fri, 29 Oct 2021 19:11:40 +0200 Subject: Add parser for tokens->ast conversion --- src/parser.h | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 src/parser.h (limited to 'src/parser.h') diff --git a/src/parser.h b/src/parser.h new file mode 100755 index 0000000..ee5febe --- /dev/null +++ b/src/parser.h @@ -0,0 +1,84 @@ +#ifndef BDL_PARSER_H +#define BDL_PARSER_H + +#include "lexer.h" + +typedef enum ObjectType { + OBJ_TYPE_NIL, + OBJ_TYPE_TRUE, + OBJ_TYPE_FALSE, + OBJ_TYPE_FIXNUM, + OBJ_TYPE_SYMBOL, + OBJ_TYPE_STRING, + OBJ_TYPE_PAIR, +} ObjectType; + +typedef struct Object { + ObjectType type; + union { + // OBJ_TYPE_FIXNUM + ssize_t fixnum; + + // OBJ_TYPE_STRING + // OBJ_TYPE_SYMBOL + char *text; + + // OBJ_TYPE_PAIR + struct { + struct Object *car; + struct Object *cdr; + }; + }; + + size_t line; + size_t col; +} Object; + +typedef struct Parser { + Token *tokens; + size_t current; +} Parser; + +typedef Object* Root; + +// Mimics the functionality in the Scanner functions, but for tokens. +Token next_token(Parser *parser); +Token previous_token(Parser *parser); +Token rewind_token(Parser *parser); +Token peek_token(const Parser *parser); +bool has_next_token(const Parser *parser); + +// Parsing operations. +Object * parse_tree(Parser *parser, Errors *errors); +Object * parse_symbol(Token tok); +Object * parse_string(Token tok); +Object * parse_bool(Token tok); +Object * parse_fixnum(Token tok); +Object * parse_list(Parser *parser, Errors *errors); +Root * parse(Token *tokens, Errors *errors); + +// Object operations. +void object_display(Object *obj); + +// Manage resources. +Object * object_alloc(Token tok, ObjectType type); +void object_free(Object *node); +void free_roots(Root *roots); + +// +// Helper macros. +// + +// Type checking. +#define IS_NIL(VAL) ((VAL)->type == OBJ_TYPE_NIL) +#define IS_TRUE(VAL) ((VAL)->type != OBJ_TYPE_FALSE) +#define IS_FALSE(VAL) ((VAL)->type == OBJ_TYPE_FALSE) +#define IS_FIXNUM(VAL) ((VAL)->type == OBJ_TYPE_FIXNUM) +#define IS_STRING(VAL) ((VAL)->type == OBJ_TYPE_STRING) +#define IS_SYMBOL(VAL) ((VAL)->type == OBJ_TYPE_SYMBOL) +#define IS_PAIR(VAL) ((VAL)->type == OBJ_TYPE_PAIR) + +// Debug. +#define OBJ_PRINT(OBJ) object_display(OBJ); printf("\n"); + +#endif // BDL_PARSER_H -- cgit v1.2.1