From 334b39474648df09f96a1cdd2a5f49e4b9494b66 Mon Sep 17 00:00:00 2001 From: Ákos Kőrösi Date: Wed, 20 May 2026 16:22:26 +0200 Subject: save --- redes/lexparse.c | 81 +++++++++++++++++++++++++++----------------------------- 1 file changed, 39 insertions(+), 42 deletions(-) (limited to 'redes/lexparse.c') diff --git a/redes/lexparse.c b/redes/lexparse.c index d23268c..adf9d1d 100644 --- a/redes/lexparse.c +++ b/redes/lexparse.c @@ -12,7 +12,9 @@ typedef struct { TokenPtrVec* top_tokens; } PseudoAst; -static void consolidate_buffer(LexingBuffer* buf, PseudoAst ps_ast) { +DECLARE_MAYBE(Token, MaybeToken) + +MaybeToken consolidate_buffer(LexingBuffer* buf) { if (buf->lit_germ.count > 0) { push_to_Word(&buf->word_germ, (Chunk){ .qmode = UN_Q, @@ -22,12 +24,15 @@ static void consolidate_buffer(LexingBuffer* buf, PseudoAst ps_ast) { buf->lit_germ = make_String(256); } if (buf->word_germ.count > 0) { - Token* tok_ptr = push_to_TokenVec(ps_ast.token_pool, (Token){ - .kind = TOK_WORD, - .as.word = buf->word_germ - }); - push_to_TokenPtrVec(ps_ast.top_tokens, tok_ptr); + return (MaybeToken){ + .some = true, + .value = (Token){ + .kind = TOK_WORD, + .as.word = buf->word_germ + } + }; } + return (MaybeToken){.some = false}; } @@ -117,21 +122,21 @@ static MaybeSpecialToken recognize_spec_token(char* line, size_t* pos) { } } -static void lex_level(char* line, size_t* pos, char until, PseudoAst ps_ast) { +TokenVec* lex_level(char* line, size_t* pos, char until, TokenVecVec* tok_seq_pool) { + TokenVec tokens = make_TokenVec(256); LexingBuffer buf = {.word_germ = make_Word(256), .lit_germ = make_String(256)}; while (line[*pos] != until) { if (line[*pos] == ' ') { - consolidate_buffer(&buf, ps_ast); + MaybeToken m_tok = consolidate_buffer(&buf); + if (m_tok.some) { + push_to_TokenVec(&tokens, m_tok.value); + } while (line[*pos] == ' ') (*pos)++; continue; } MaybeSpecialToken m_spec = recognize_spec_token(line, pos); if (m_spec.some) { - Token* tok_ptr = push_to_TokenVec(ps_ast.token_pool, (Token){ - .kind = TOK_SPEC, - .as.spec = m_spec.value - }); - push_to_TokenPtrVec(ps_ast.top_tokens, tok_ptr); + push_to_TokenVec(&tokens, (Token){.kind = TOK_SPEC, .as.spec = m_spec.value}); continue; } @@ -143,43 +148,35 @@ static void lex_level(char* line, size_t* pos, char until, PseudoAst ps_ast) { push_to_Word(&buf.word_germ, chunk); } else if (line[*pos] == '<' && line[(*pos)+1] == '(') { *pos += 2; - consolidate_buffer(&buf, ps_ast); - TokenPtrVec procsub_toks = make_TokenPtrVec(256); - lex_level(line, pos, ')', (PseudoAst){ - .token_pool = ps_ast.token_pool, - .top_tokens = &procsub_toks - }); - (*pos)++; // consume ')' - Token* tok_ptr = push_to_TokenVec(ps_ast.token_pool, (Token){ - .kind = TOK_SUB_IN, - .as.procsub_toks = procsub_toks, + MaybeToken m_tok = consolidate_buffer(&buf); + if (m_tok.some) { + push_to_TokenVec(&tokens, m_tok.value); + } + TokenVec* sub_toks = lex_level(line, pos, ')', tok_seq_pool); + (*pos)++; + push_to_TokenVec(&tokens, (Token){ + .kind = TOK_SUB_IN, + .as.procsub_token_vec = sub_toks }); - push_to_TokenPtrVec(ps_ast.top_tokens, tok_ptr); } else if (line[*pos] == '>' && line[(*pos)+1] == '(') { *pos += 2; - consolidate_buffer(&buf, ps_ast); - TokenPtrVec procsub_toks = make_TokenPtrVec(256); - lex_level(line, pos, ')', (PseudoAst){ - .token_pool = ps_ast.token_pool, - .top_tokens = &procsub_toks - }); - (*pos)++; // consume ')' - Token* tok_ptr = push_to_TokenVec(ps_ast.token_pool, (Token){ - .kind = TOK_SUB_OUT, - .as.procsub_toks = procsub_toks, + MaybeToken m_tok = consolidate_buffer(&buf); + if (m_tok.some) { + push_to_TokenVec(&tokens, m_tok.value); + } + TokenVec* sub_toks = lex_level(line, pos, ')', tok_seq_pool); + (*pos)++; + push_to_TokenVec(&tokens, (Token){ + .kind = TOK_SUB_OUT, + .as.procsub_token_vec = sub_toks }); - push_to_TokenPtrVec(ps_ast.top_tokens, tok_ptr); } } } Ast lex(char* input) { size_t line_pos = 0; - TokenVec token_pool = make_TokenVec(256); - TokenPtrVec top_tokens = make_TokenPtrVec(256); - lex_level(input, &line_pos, '\0', (PseudoAst){ - .token_pool = &token_pool, - .top_tokens = &top_tokens - }); - return (Ast){.token_pool = token_pool, .top_tokens = top_tokens}; + TokenVecVec token_seqs = make_TokenVecVec(256); + TokenVec* root_ptr = lex_level(input, &line_pos, '\0', &token_seqs); + return (Ast){.region_pool = token_seqs, .root = root_ptr}; } -- cgit v1.2.3