Add a parser struct.

This commit is contained in:
Danila Fedorin 2018-02-11 22:23:02 -08:00
parent 37a6f31b5f
commit f67b98d7a6
5 changed files with 48 additions and 6 deletions

View File

@ -4,6 +4,7 @@
#include "ht.h" #include "ht.h"
#include "lexer.h" #include "lexer.h"
#include "table.h" #include "table.h"
#include "parser.h"
#include "libabacus_result.h" #include "libabacus_result.h"
/** /**
@ -52,6 +53,11 @@ struct libab_s {
* to tokens. * to tokens.
*/ */
libab_lexer lexer; libab_lexer lexer;
/**
* The parser used to convert
* tokens to a tree.
*/
libab_parser parser;
/** /**
* The table used to store top-level * The table used to store top-level
* things like functions and operators. * things like functions and operators.

View File

@ -5,12 +5,36 @@
#include "ll.h" #include "ll.h"
#include "tree.h" #include "tree.h"
/**
* The parser that is used by libabacus
* to store information for converting
* tokens into trees.
*/
struct libab_parser_s {
libab_table* base_table;
};
typedef struct libab_parser_s libab_parser;
/**
* Initializes the parser.
* @param parser the parser to intialize.
* @param table the table of "reserved" entries like operators.
*/
void libab_parser_init(libab_parser* parser, libab_table* table);
/** /**
* Parses the given list of tokens into the given tree pointer. * Parses the given list of tokens into the given tree pointer.
* @param parser the parser to use for parsing text.
* @param tokens the tokens to use for parsing. * @param tokens the tokens to use for parsing.
* @param string the string to use for determining token values. * @param string the string to use for determining token values.
* @param store_into tree pointer to store the new data into. * @param store_into tree pointer to store the new data into.
*/ */
libab_result libab_parse_tokens(ll* tokens, const char* string, libab_tree** store_into); libab_result libab_parser_parse(libab_parser* parser, ll* tokens,
const char* string, libab_tree** store_into);
/**
* Releases the resources allocated by the parser.
* @param parser the parser to release.
*/
void libab_parser_free(libab_parser* parser);
#endif #endif

View File

@ -1,7 +1,7 @@
#ifndef LIBABACUS_TREE_H #ifndef LIBABACUS_TREE_H
#define LIBABACUS_TREE_H #define LIBABACUS_TREE_H
#include "libabacus.h" #include "libabacus_result.h"
#include "vec.h" #include "vec.h"
/** /**

View File

@ -2,10 +2,12 @@
libab_result libab_init(libab* ab) { libab_result libab_init(libab* ab) {
libab_table_init(&ab->table); libab_table_init(&ab->table);
libab_parser_init(&ab->parser, &ab->table);
return libab_lexer_init(&ab->lexer); return libab_lexer_init(&ab->lexer);
} }
libab_result libab_free(libab* ab) { libab_result libab_free(libab* ab) {
libab_table_free(&ab->table); libab_table_free(&ab->table);
libab_parser_free(&ab->parser);
return libab_lexer_free(&ab->lexer); return libab_lexer_free(&ab->lexer);
} }

View File

@ -1,6 +1,6 @@
#include "libabacus.h"
#include "parser.h" #include "parser.h"
#include "libabacus_util.h" #include "libabacus_util.h"
#include "libabacus_result.h"
#include "lexer.h" #include "lexer.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -9,15 +9,18 @@ struct parser_state {
ll_node* current_node; ll_node* current_node;
libab_lexer_match* current_match; libab_lexer_match* current_match;
const char* string; const char* string;
libab_table* base_table;
}; };
void _parser_state_update(struct parser_state* state) { void _parser_state_update(struct parser_state* state) {
state->current_match = state->current_node ? state->current_node->data : NULL; state->current_match = state->current_node ? state->current_node->data : NULL;
} }
void _parser_state_init(struct parser_state* state, ll* tokens, const char* string) { void _parser_state_init(struct parser_state* state,
ll* tokens, const char* string, libab_table* table) {
state->current_node = tokens->head; state->current_node = tokens->head;
state->string = string; state->string = string;
state->base_table = table;
_parser_state_update(state); _parser_state_update(state);
} }
@ -109,10 +112,14 @@ libab_result _parse_block(struct parser_state* state,
return result; return result;
} }
libab_result libab_parse_tokens(ll* tokens, const char* string, libab_tree** store_into) { void libab_parser_init(libab_parser* parser, libab_table* table) {
parser->base_table = table;
}
libab_result libab_parser_parse(libab_parser* parser, ll* tokens,
const char* string, libab_tree** store_into) {
libab_result result = LIBAB_SUCCESS; libab_result result = LIBAB_SUCCESS;
struct parser_state state; struct parser_state state;
_parser_state_init(&state, tokens, string); _parser_state_init(&state, tokens, string, parser->base_table);
result = _parse_block(&state, store_into, 0); result = _parse_block(&state, store_into, 0);
if(result == LIBAB_SUCCESS) { if(result == LIBAB_SUCCESS) {
@ -121,3 +128,6 @@ libab_result libab_parse_tokens(ll* tokens, const char* string, libab_tree** sto
return result; return result;
} }
void libab_parser_free(libab_parser* parser) {
parser->base_table = NULL;
}