update: started to norme a bit more parser.c
This commit is contained in:
parent
86695aad14
commit
b264fae51a
9 changed files with 372 additions and 521 deletions
|
|
@ -30,6 +30,8 @@ node/node_getter_funcs3 \
|
|||
node/node_iterator \
|
||||
node/node_relevent \
|
||||
parser \
|
||||
parser/parser_external_scanner \
|
||||
parser/parser_lifetime \
|
||||
point/point_funcs1 \
|
||||
point/point_funcs2 \
|
||||
scanner/scanner \
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/07/22 13:54:54 by maiboyer #+# #+# */
|
||||
/* Updated: 2024/09/02 20:15:44 by maiboyer ### ########.fr */
|
||||
/* Updated: 2024/09/11 16:40:31 by maiboyer ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -28,14 +28,6 @@
|
|||
#define TREE_SITTER_LANGUAGE_VERSION 14
|
||||
#define TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION 13
|
||||
|
||||
TSParser *ts_parser_new(void);
|
||||
void ts_parser_delete(TSParser *self);
|
||||
const TSLanguage *ts_parser_language(const TSParser *self);
|
||||
bool ts_parser_set_language(TSParser *self, const TSLanguage *language);
|
||||
TSTree *ts_parser_parse(TSParser *self, TSInput input);
|
||||
TSTree *ts_parser_parse_string(TSParser *self, t_const_str string, t_u32 length);
|
||||
void ts_parser_reset(TSParser *self);
|
||||
|
||||
TSTree *ts_tree_copy(const TSTree *self);
|
||||
void ts_tree_delete(TSTree *self);
|
||||
TSNode ts_tree_root_node(const TSTree *self);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/09/10 13:56:47 by maiboyer #+# #+# */
|
||||
/* Updated: 2024/09/10 13:58:59 by maiboyer ### ########.fr */
|
||||
/* Updated: 2024/09/11 17:25:29 by maiboyer ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -38,7 +38,6 @@ typedef struct s_error_status t_error_status;
|
|||
typedef enum e_error_comparison t_error_comparison;
|
||||
typedef struct s_string_input t_string_input;
|
||||
|
||||
|
||||
struct TSParser
|
||||
{
|
||||
t_lexer lexer;
|
||||
|
|
@ -79,4 +78,36 @@ struct s_string_input
|
|||
t_u32 length;
|
||||
};
|
||||
|
||||
TSParser *ts_parser_new(TSLanguage *language);
|
||||
void ts_parser_delete(TSParser *self);
|
||||
|
||||
void ts_parser__accept(TSParser *self, t_stack_version version, t_subtree lookahead);
|
||||
bool ts_parser__advance(TSParser *self, t_stack_version version);
|
||||
bool ts_parser__better_version_exists(TSParser *self, t_stack_version version, bool is_in_error, t_u32 cost);
|
||||
bool ts_parser__breakdown_top_of_stack(TSParser *self, t_stack_version version);
|
||||
t_error_comparison ts_parser__compare_versions(TSParser *self, t_error_status a, t_error_status b);
|
||||
t_u32 ts_parser__condense_stack(TSParser *self);
|
||||
bool ts_parser__do_all_potential_reductions(TSParser *self, t_stack_version starting_version, TSSymbol lookahead_symbol);
|
||||
void ts_parser__external_scanner_create(TSParser *self);
|
||||
void ts_parser__external_scanner_deserialize(TSParser *self, t_subtree external_token);
|
||||
void ts_parser__external_scanner_destroy(TSParser *self);
|
||||
bool ts_parser__external_scanner_scan(TSParser *self, TSStateId external_lex_state);
|
||||
t_u32 ts_parser__external_scanner_serialize(TSParser *self);
|
||||
void ts_parser__handle_error(TSParser *self, t_stack_version version, t_subtree lookahead);
|
||||
t_subtree ts_parser__lex(TSParser *self, t_stack_version version, TSStateId parse_state);
|
||||
void ts_parser__recover(TSParser *self, t_stack_version version, t_subtree lookahead);
|
||||
bool ts_parser__recover_to_state(TSParser *self, t_stack_version version, t_u32 depth, TSStateId goal_state);
|
||||
t_stack_version ts_parser__reduce(TSParser *self, t_stack_version version, TSSymbol symbol, t_u32 count, int dynamic_precedence,
|
||||
t_u16 production_id, bool is_fragile, bool end_of_non_terminal_extra);
|
||||
bool ts_parser__select_children(TSParser *self, t_subtree left, const t_vec_subtree *children);
|
||||
bool ts_parser__select_tree(TSParser *self, t_subtree left, t_subtree right);
|
||||
void ts_parser__shift(TSParser *self, t_stack_version version, TSStateId state, t_subtree lookahead, bool extra);
|
||||
t_error_status ts_parser__version_status(TSParser *self, t_stack_version version);
|
||||
bool ts_parser_has_outstanding_parse(TSParser *self);
|
||||
const TSLanguage *ts_parser_language(const TSParser *self);
|
||||
TSTree *ts_parser_parse(TSParser *self, TSInput input);
|
||||
TSTree *ts_parser_parse_string(TSParser *self, t_const_str string, t_u32 length);
|
||||
void ts_parser_reset(TSParser *self);
|
||||
bool ts_parser_set_language(TSParser *self, const TSLanguage *language);
|
||||
const t_u8 *ts_string_input_read(void *_self, t_u32 byte, TSPoint point, t_u32 *length);
|
||||
#endif /* PARSER_INNER_H */
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
62
parser/src/parser/parser_external_scanner.c
Normal file
62
parser/src/parser/parser_external_scanner.c
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
/* ************************************************************************** */
|
||||
/* */
|
||||
/* ::: :::::::: */
|
||||
/* parser_external_scanner.c :+: :+: :+: */
|
||||
/* +:+ +:+ +:+ */
|
||||
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/09/11 16:44:11 by maiboyer #+# #+# */
|
||||
/* Updated: 2024/09/11 16:44:49 by maiboyer ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "parser/inner/parser_inner.h"
|
||||
|
||||
void ts_parser__external_scanner_create(TSParser *self)
|
||||
{
|
||||
self->external_scanner_payload = self->language->external_scanner.create();
|
||||
}
|
||||
|
||||
void ts_parser__external_scanner_destroy(TSParser *self)
|
||||
{
|
||||
if (self->external_scanner_payload != NULL)
|
||||
{
|
||||
self->language->external_scanner.destroy(self->external_scanner_payload);
|
||||
self->external_scanner_payload = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
t_u32 ts_parser__external_scanner_serialize(TSParser *self)
|
||||
{
|
||||
t_u32 length;
|
||||
|
||||
length = self->language->external_scanner.serialize(self->external_scanner_payload, self->lexer.debug_buffer);
|
||||
if (length > TREE_SITTER_SERIALIZATION_BUFFER_SIZE)
|
||||
me_abort("assertion failed in " __FILE__ " `length > "
|
||||
"TREE_SITTER_SERIALIZATION_BUFFER_SIZE`");
|
||||
return length;
|
||||
}
|
||||
|
||||
void ts_parser__external_scanner_deserialize(TSParser *self, t_subtree external_token)
|
||||
{
|
||||
const t_u8 *data;
|
||||
t_u32 length;
|
||||
|
||||
data = NULL;
|
||||
length = 0;
|
||||
if (external_token)
|
||||
{
|
||||
data = ts_external_scanner_state_data(&external_token->external_scanner_state);
|
||||
length = external_token->external_scanner_state.length;
|
||||
printf("HERE\n");
|
||||
}
|
||||
self->language->external_scanner.deserialize(self->external_scanner_payload, data, length);
|
||||
}
|
||||
|
||||
bool ts_parser__external_scanner_scan(TSParser *self, TSStateId external_lex_state)
|
||||
{
|
||||
const bool *valid_external_tokens;
|
||||
|
||||
valid_external_tokens = ts_language_enabled_external_tokens(self->language, external_lex_state);
|
||||
return self->language->external_scanner.scan(self->external_scanner_payload, &self->lexer.data, valid_external_tokens);
|
||||
}
|
||||
|
|
@ -6,8 +6,52 @@
|
|||
/* By: maiboyer <maiboyer@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/09/10 13:56:13 by maiboyer #+# #+# */
|
||||
/* Updated: 2024/09/10 13:56:30 by maiboyer ### ########.fr */
|
||||
/* Updated: 2024/09/11 16:43:43 by maiboyer ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
#include "parser/inner/parser_inner.h"
|
||||
|
||||
TSParser *ts_parser_new(TSLanguage *language)
|
||||
{
|
||||
TSParser *self;
|
||||
|
||||
self = mem_alloc(sizeof(*self));
|
||||
ts_lexer_init(&self->lexer);
|
||||
self->reduce_actions = vec_reduce_action_new(4, NULL);
|
||||
self->stack = ts_stack_new();
|
||||
self->finished_tree = NULL;
|
||||
self->language = language;
|
||||
self->has_scanner_error = false;
|
||||
self->external_scanner_payload = NULL;
|
||||
self->operation_count = 0;
|
||||
return self;
|
||||
}
|
||||
|
||||
void ts_parser_delete(TSParser *self)
|
||||
{
|
||||
if (!self)
|
||||
return;
|
||||
ts_parser_reset(self);
|
||||
self->language = NULL;
|
||||
ts_stack_delete(self->stack);
|
||||
vec_reduce_action_free(self->reduce_actions);
|
||||
array_delete(&self->trailing_extras);
|
||||
array_delete(&self->trailing_extras2);
|
||||
array_delete(&self->scratch_trees);
|
||||
mem_free(self);
|
||||
}
|
||||
|
||||
void ts_parser_reset(TSParser *self)
|
||||
{
|
||||
ts_parser__external_scanner_destroy(self);
|
||||
ts_lexer_reset(&self->lexer, length_zero());
|
||||
ts_stack_clear(self->stack);
|
||||
if (self->finished_tree)
|
||||
{
|
||||
ts_subtree_release(self->finished_tree);
|
||||
self->finished_tree = NULL;
|
||||
}
|
||||
self->accept_count = 0;
|
||||
self->has_scanner_error = false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/09/06 16:31:41 by rparodi #+# #+# */
|
||||
/* Updated: 2024/09/06 16:37:49 by rparodi ### ########.fr */
|
||||
/* Updated: 2024/09/11 16:39:09 by maiboyer ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -26,6 +26,7 @@
|
|||
#include "parser/api.h"
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include "parser/inner/parser_inner.h"
|
||||
|
||||
void ft_exit(t_state *maiboyerlpb, t_u8 exit_status);
|
||||
void print_node_data(t_node *t, t_usize depth);
|
||||
|
|
@ -84,11 +85,8 @@ void ft_take_args(t_state *state)
|
|||
|
||||
t_first_parser *create_myparser(void)
|
||||
{
|
||||
t_language *lang;
|
||||
t_first_parser *parser;
|
||||
|
||||
lang = tree_sitter_sh();
|
||||
parser = ts_parser_new();
|
||||
ts_parser_set_language(parser, lang);
|
||||
parser = ts_parser_new(tree_sitter_sh());
|
||||
return (parser);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
/* By: rparodi <rparodi@student.42.fr> +#+ +:+ +#+ */
|
||||
/* +#+#+#+#+#+ +#+ */
|
||||
/* Created: 2024/03/28 14:40:38 by rparodi #+# #+# */
|
||||
/* Updated: 2024/09/06 16:33:58 by rparodi ### ########.fr */
|
||||
/* Updated: 2024/09/11 16:41:52 by maiboyer ### ########.fr */
|
||||
/* */
|
||||
/* ************************************************************************** */
|
||||
|
||||
|
|
@ -24,6 +24,7 @@
|
|||
#include "me/string/string.h"
|
||||
#include "me/types.h"
|
||||
#include "parser/api.h"
|
||||
#include "parser/inner/parser_inner.h"
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
|
|
@ -43,8 +44,7 @@ void ft_take_args(t_state *state);
|
|||
t_language *tree_sitter_sh(void);
|
||||
void ast_free(t_ast_node node);
|
||||
|
||||
t_error split_str_first(\
|
||||
t_const_str s, char splitter, t_str *before, t_str *after)
|
||||
t_error split_str_first(t_const_str s, char splitter, t_str *before, t_str *after)
|
||||
{
|
||||
t_usize i;
|
||||
|
||||
|
|
@ -106,8 +106,7 @@ t_node parse_str(t_state *state)
|
|||
t_node ret;
|
||||
t_ast_node out;
|
||||
|
||||
tree = ts_parser_parse_string(\
|
||||
state->parser, state->str_input, str_len(state->str_input));
|
||||
tree = ts_parser_parse_string(state->parser, state->str_input, str_len(state->str_input));
|
||||
node = ts_tree_root_node(tree);
|
||||
if (ast_from_node(node, state->str_input, &out))
|
||||
{
|
||||
|
|
|
|||
3
test_pipeline.sh
Executable file
3
test_pipeline.sh
Executable file
|
|
@ -0,0 +1,3 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
make && valgrind --leak-check=full --show-leak-kinds=none --track-origins=yes --track-fds=yes --trace-children=yes --read-var-info=yes --read-inline-info=yes ./minishell <<<'cat </dev/null | cat | cat "./.envrc"'
|
||||
Loading…
Add table
Add a link
Reference in a new issue