summaryrefslogtreecommitdiff
path: root/redes/lexparse.c
diff options
context:
space:
mode:
authorÁkos Kőrösi <korakos99@gmail.com>2026-05-20 16:22:26 +0200
committerÁkos Kőrösi <korakos99@gmail.com>2026-05-20 16:22:26 +0200
commit334b39474648df09f96a1cdd2a5f49e4b9494b66 (patch)
tree392f1d15dffc3184ec6b69315a29efcf8672965f /redes/lexparse.c
parent77e7fb03e8ed61fa4df227188788958c13d27fdf (diff)
save
Diffstat (limited to 'redes/lexparse.c')
-rw-r--r--redes/lexparse.c81
1 files changed, 39 insertions, 42 deletions
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};
}