Compiling!

This commit is contained in:
Maieul BOYER 2024-04-30 14:20:06 +02:00
parent 019d25174c
commit a22b9ea234
No known key found for this signature in database
24 changed files with 607 additions and 113 deletions

View file

@ -1,6 +1,7 @@
#include "array.h"
#include "me/mem/mem_alloc.h"
#include "me/types.h"
#include "me/vec/vec_parser_heredoc.h"
#include "parser/types/types_lexer.h"
#include "parser/types/types_scanner.h"
#include "parser/types/types_scanner_ctx.h"
#include <assert.h>
@ -42,26 +43,14 @@ enum TokenType
ERROR_RECOVERY,
};
typedef Array(char) t_string;
// typedef void *String;
typedef struct s_heredoc
{
bool is_raw;
bool started;
bool allows_indent;
t_string delimiter;
t_string current_leading_word;
} t_heredoc;
static inline t_heredoc heredoc_new(void)
{
return ((t_heredoc){
.is_raw = false,
.started = false,
.allows_indent = false,
.delimiter = array_new(),
.current_leading_word = array_new(),
.delimiter = alloc_new_buffer(0),
.current_leading_word = alloc_new_buffer(0),
});
}
@ -80,12 +69,12 @@ static inline bool in_error_recovery(const bool *valid_symbols)
return valid_symbols[ERROR_RECOVERY];
}
static inline void reset_string(t_string *string)
static inline void reset_string(t_buffer_str *string)
{
if (string->size > 0)
if (string->len > 0)
{
memset(string->contents, 0, string->size);
array_clear(string);
memset(string->buf, 0, string->len);
string->len = 0;
}
}
@ -97,19 +86,19 @@ static inline void reset_heredoc(t_heredoc *heredoc)
reset_string(&heredoc->delimiter);
}
static inline void reset(t_scanner *scanner)
static inline void reset(t_scanner_ctx *scanner)
{
t_u32 i;
i = 0;
while (i < scanner->heredocs.size)
while (i < scanner->heredocs.len)
{
reset_heredoc(array_get(&scanner->heredocs, i));
reset_heredoc(&scanner->heredocs.buffer[i]);
i++;
}
}
static unsigned serialize(t_scanner *scanner, char *buffer)
static unsigned serialize(t_scanner_ctx *scanner, char *buffer)
{
t_u32 size;
t_u32 i;
@ -119,31 +108,32 @@ static unsigned serialize(t_scanner *scanner, char *buffer)
buffer[size++] = (char)scanner->last_glob_paren_depth;
buffer[size++] = (char)scanner->ext_was_in_double_quote;
buffer[size++] = (char)scanner->ext_saw_outside_quote;
buffer[size++] = (char)scanner->heredocs.size;
buffer[size++] = (char)scanner->heredocs.len;
i = 0;
while (i < scanner->heredocs.size)
while (i < scanner->heredocs.len)
{
heredoc = array_get(&scanner->heredocs, i);
if (heredoc->delimiter.size + 3 + size >=
heredoc = &scanner->heredocs.buffer[i];
if (heredoc->delimiter.len + 3 + size >=
TREE_SITTER_SERIALIZATION_BUFFER_SIZE)
return 0;
buffer[size++] = (char)heredoc->is_raw;
buffer[size++] = (char)heredoc->started;
buffer[size++] = (char)heredoc->allows_indent;
memcpy(&buffer[size], &heredoc->delimiter.size, sizeof(t_u32));
memcpy(&buffer[size], &heredoc->delimiter.len, sizeof(t_u32));
size += sizeof(t_u32);
if (heredoc->delimiter.size > 0)
if (heredoc->delimiter.len > 0)
{
memcpy(&buffer[size], heredoc->delimiter.contents,
heredoc->delimiter.size);
size += heredoc->delimiter.size;
memcpy(&buffer[size], heredoc->delimiter.buf,
heredoc->delimiter.len);
size += heredoc->delimiter.len;
}
i++;
}
return size;
}
static void deserialize(t_scanner *scanner, const char *buffer, unsigned length)
static void deserialize(t_scanner_ctx *scanner, const char *buffer,
unsigned length)
{
t_u32 size;
t_u32 heredoc_count;
@ -163,24 +153,24 @@ static void deserialize(t_scanner *scanner, const char *buffer, unsigned length)
while (i < heredoc_count)
{
heredoc = NULL;
if (i < scanner->heredocs.size)
heredoc = array_get(&scanner->heredocs, i);
if (i < scanner->heredocs.len)
heredoc = &scanner->heredocs.buffer[i];
else
{
array_push(&scanner->heredocs, heredoc_new());
heredoc = array_back(&scanner->heredocs);
vec_parser_heredoc_push(&scanner->heredocs, heredoc_new());
heredoc = &scanner->heredocs.buffer[scanner->heredocs.len - 1];
}
heredoc->is_raw = buffer[size++];
heredoc->started = buffer[size++];
heredoc->allows_indent = buffer[size++];
memcpy(&heredoc->delimiter.size, &buffer[size], sizeof(t_u32));
memcpy(&heredoc->delimiter.len, &buffer[size], sizeof(t_u32));
size += sizeof(t_u32);
array_reserve(&heredoc->delimiter, heredoc->delimiter.size);
if (heredoc->delimiter.size > 0)
str_reserve(&heredoc->delimiter, heredoc->delimiter.len);
if (heredoc->delimiter.len > 0)
{
memcpy(heredoc->delimiter.contents, &buffer[size],
heredoc->delimiter.size);
size += heredoc->delimiter.size;
memcpy(heredoc->delimiter.buf, &buffer[size],
heredoc->delimiter.len);
size += heredoc->delimiter.len;
}
i++;
}
@ -195,7 +185,7 @@ static void deserialize(t_scanner *scanner, const char *buffer, unsigned length)
* POSIX-mandated substitution, and assumes the default value for
* IFS.
*/
static bool advance_word(t_lexer *lexer, t_string *unquoted_word)
static bool advance_word(t_lexer *lexer, t_buffer_str *unquoted_word)
{
bool empty;
t_i32 quote;
@ -216,10 +206,9 @@ static bool advance_word(t_lexer *lexer, t_string *unquoted_word)
return (false);
}
empty = false;
array_push(unquoted_word, lexer->lookahead);
push_str_char(unquoted_word, lexer->lookahead);
advance(lexer);
}
array_push(unquoted_word, '\0');
if (quote && lexer->lookahead == quote)
advance(lexer);
return (!empty);
@ -269,31 +258,29 @@ static bool scan_heredoc_end_identifier(t_heredoc *heredoc, t_lexer *lexer)
t_i32 size;
size = 0;
if (heredoc->delimiter.size > 0)
if (heredoc->delimiter.len > 0)
{
while (lexer->lookahead != '\0' && lexer->lookahead != '\n' &&
(t_i32)*array_get(&heredoc->delimiter, size) ==
lexer->lookahead &&
heredoc->current_leading_word.size < heredoc->delimiter.size)
(t_i32) * (&heredoc->delimiter.buf[size]) == lexer->lookahead &&
heredoc->current_leading_word.len < heredoc->delimiter.len)
{
array_push(&heredoc->current_leading_word, lexer->lookahead);
push_str_char(&heredoc->current_leading_word, lexer->lookahead);
advance(lexer);
size++;
}
}
array_push(&heredoc->current_leading_word, '\0');
return heredoc->delimiter.size == 0
return heredoc->delimiter.len == 0
? false
: strcmp(heredoc->current_leading_word.contents,
heredoc->delimiter.contents) == 0;
: strcmp(heredoc->current_leading_word.buf,
heredoc->delimiter.buf) == 0;
}
static bool scan_heredoc_content(t_scanner *scanner, t_lexer *lexer,
static bool scan_heredoc_content(t_scanner_ctx *scanner, t_lexer *lexer,
enum TokenType middle_type,
enum TokenType end_type)
{
bool did_advance = false;
t_heredoc *heredoc = array_back(&scanner->heredocs);
t_heredoc *heredoc = (&scanner->heredocs.buffer[scanner->heredocs.len - 1]);
for (;;)
{
@ -368,9 +355,7 @@ static bool scan_heredoc_content(t_scanner *scanner, t_lexer *lexer,
if (scan_heredoc_end_identifier(heredoc, lexer))
{
if (lexer->result_symbol == HEREDOC_END)
{
array_pop(&scanner->heredocs);
}
vec_parser_heredoc_pop(&scanner->heredocs, NULL);
return true;
}
break;
@ -417,7 +402,7 @@ static bool scan_heredoc_content(t_scanner *scanner, t_lexer *lexer,
}
}
}
static bool regex_scan(t_scanner *scanner, t_lexer *lexer,
static bool regex_scan(t_scanner_ctx *scanner, t_lexer *lexer,
const bool *valid_symbols)
{
(void)(scanner);
@ -642,7 +627,7 @@ static bool regex_scan(t_scanner *scanner, t_lexer *lexer,
return (false);
}
static bool extglob_pattern_scan(t_scanner *scanner, t_lexer *lexer,
static bool extglob_pattern_scan(t_scanner_ctx *scanner, t_lexer *lexer,
const bool *valid_symbols)
{
if (valid_symbols[EXTGLOB_PATTERN] && !in_error_recovery(valid_symbols))
@ -918,7 +903,7 @@ static bool extglob_pattern_scan(t_scanner *scanner, t_lexer *lexer,
return (false);
}
static bool expansion_word_scan(t_scanner *scanner, t_lexer *lexer,
static bool expansion_word_scan(t_scanner_ctx *scanner, t_lexer *lexer,
const bool *valid_symbols)
{
(void)(scanner);
@ -1022,7 +1007,7 @@ static bool expansion_word_scan(t_scanner *scanner, t_lexer *lexer,
return (false);
}
static bool brace_start_scan(t_scanner *scanner, t_lexer *lexer,
static bool brace_start_scan(t_scanner_ctx *scanner, t_lexer *lexer,
const bool *valid_symbols)
{
(void)(scanner);
@ -1074,7 +1059,8 @@ static bool brace_start_scan(t_scanner *scanner, t_lexer *lexer,
}
return (false);
}
static bool scan(t_scanner *scanner, t_lexer *lexer, const bool *valid_symbols)
static bool scan(t_scanner_ctx *scanner, t_lexer *lexer,
const bool *valid_symbols)
{
if (valid_symbols[CONCAT] && !in_error_recovery(valid_symbols))
{
@ -1178,38 +1164,41 @@ static bool scan(t_scanner *scanner, t_lexer *lexer, const bool *valid_symbols)
return (true);
}
}
t_heredoc *back;
vec_parser_heredoc_back(&scanner->heredocs, &back);
if ((valid_symbols[HEREDOC_BODY_BEGINNING] ||
valid_symbols[SIMPLE_HEREDOC_BODY]) &&
scanner->heredocs.size > 0 &&
!array_back(&scanner->heredocs)->started &&
scanner->heredocs.len > 0 && !back->started &&
!in_error_recovery(valid_symbols))
return (scan_heredoc_content(scanner, lexer, HEREDOC_BODY_BEGINNING,
SIMPLE_HEREDOC_BODY));
if (valid_symbols[HEREDOC_END] && scanner->heredocs.size > 0)
if (valid_symbols[HEREDOC_END] && scanner->heredocs.len > 0)
{
t_heredoc *heredoc = array_back(&scanner->heredocs);
t_heredoc *heredoc;
vec_parser_heredoc_back(&scanner->heredocs, &heredoc);
if (scan_heredoc_end_identifier(heredoc, lexer))
{
array_delete(&heredoc->current_leading_word);
array_delete(&heredoc->delimiter);
array_pop(&scanner->heredocs);
str_free(heredoc->current_leading_word);
str_free(heredoc->delimiter);
scanner->heredocs.len -= 1;
lexer->result_symbol = HEREDOC_END;
return (true);
}
}
if (valid_symbols[HEREDOC_CONTENT] && scanner->heredocs.size > 0 &&
array_back(&scanner->heredocs)->started &&
!in_error_recovery(valid_symbols))
vec_parser_heredoc_back(&scanner->heredocs, &back);
if (valid_symbols[HEREDOC_CONTENT] && scanner->heredocs.len > 0 &&
back->started && !in_error_recovery(valid_symbols))
return (
scan_heredoc_content(scanner, lexer, HEREDOC_CONTENT, HEREDOC_END));
if (valid_symbols[HEREDOC_START] && !in_error_recovery(valid_symbols) &&
scanner->heredocs.size > 0)
return (scan_heredoc_start(array_back(&scanner->heredocs), lexer));
scanner->heredocs.len > 0)
{
vec_parser_heredoc_back(&scanner->heredocs, &back);
return (scan_heredoc_start(back, lexer));
}
if (valid_symbols[TEST_OPERATOR] && !valid_symbols[EXPANSION_WORD])
{
while (isspace(lexer->lookahead) && lexer->lookahead != '\n')
@ -1368,7 +1357,7 @@ static bool scan(t_scanner *scanner, t_lexer *lexer, const bool *valid_symbols)
advance(lexer);
t_heredoc heredoc = heredoc_new();
heredoc.allows_indent = true;
array_push(&scanner->heredocs, heredoc);
vec_parser_heredoc_push(&scanner->heredocs, heredoc);
lexer->result_symbol = HEREDOC_ARROW_DASH;
}
else if (lexer->lookahead == '<' || lexer->lookahead == '=')
@ -1376,7 +1365,7 @@ static bool scan(t_scanner *scanner, t_lexer *lexer, const bool *valid_symbols)
else
{
t_heredoc heredoc = heredoc_new();
array_push(&scanner->heredocs, heredoc);
vec_parser_heredoc_push(&scanner->heredocs, heredoc);
lexer->result_symbol = HEREDOC_ARROW;
}
return (true);
@ -1475,21 +1464,21 @@ static bool scan(t_scanner *scanner, t_lexer *lexer, const bool *valid_symbols)
void *tree_sitter_bash_external_scanner_create()
{
t_scanner *scanner = calloc(1, sizeof(t_scanner));
array_init(&scanner->heredocs);
t_scanner_ctx *scanner = mem_alloc(sizeof(t_scanner_ctx));
scanner->heredocs = vec_parser_heredoc_new(5, NULL);
return (scanner);
}
bool tree_sitter_bash_external_scanner_scan(void *payload, t_lexer *lexer,
const bool *valid_symbols)
{
t_scanner *scanner = (t_scanner *)payload;
t_scanner_ctx *scanner = (t_scanner_ctx *)payload;
return (scan(scanner, lexer, valid_symbols));
}
unsigned tree_sitter_bash_external_scanner_serialize(void *payload, char *state)
{
t_scanner *scanner = (t_scanner *)payload;
t_scanner_ctx *scanner = (t_scanner_ctx *)payload;
return (serialize(scanner, state));
}
@ -1497,19 +1486,19 @@ void tree_sitter_bash_external_scanner_deserialize(void *payload,
const char *state,
unsigned length)
{
t_scanner *scanner = (t_scanner *)payload;
t_scanner_ctx *scanner = (t_scanner_ctx *)payload;
deserialize(scanner, state, length);
}
void tree_sitter_bash_external_scanner_destroy(void *payload)
{
t_scanner *scanner = (t_scanner *)payload;
for (size_t i = 0; i < scanner->heredocs.size; i++)
t_scanner_ctx *scanner = (t_scanner_ctx *)payload;
for (size_t i = 0; i < scanner->heredocs.len; i++)
{
t_heredoc *heredoc = array_get(&scanner->heredocs, i);
array_delete(&heredoc->current_leading_word);
array_delete(&heredoc->delimiter);
t_heredoc *heredoc = &scanner->heredocs.buffer[i];
str_free(heredoc->current_leading_word);
str_free(heredoc->delimiter);
}
array_delete(&scanner->heredocs);
vec_parser_heredoc_free(scanner->heredocs);
free(scanner);
}