From 0cf6fc7cc6581e8a01e2d475858fec7b352fe4d0 Mon Sep 17 00:00:00 2001 From: Ákos Kőrösi Date: Thu, 21 May 2026 11:53:45 +0200 Subject: redesign token types, pipes don't work now --- redes/lexparse.c | 48 +++++++++++++++++++++++++++++++++++++++--------- redes/preproc.c | 15 +++++---------- redes/syntax.h | 29 +++++++++++++++++++++-------- 3 files changed, 65 insertions(+), 27 deletions(-) diff --git a/redes/lexparse.c b/redes/lexparse.c index e064229..4b0fffc 100644 --- a/redes/lexparse.c +++ b/redes/lexparse.c @@ -98,7 +98,13 @@ static MaybeSpecialToken recognize_spec_token(char* line, size_t* pos) { switch (line[*pos]) { case '|': (*pos)++; - return (MaybeSpecialToken){.some = true, .value = SPEC_PIPE}; + return (MaybeSpecialToken){ + .some = true, + .value = (SpecialToken){ + .kind = SPEC_OP, + .as.op = OP_PIPE, + } + }; case '>': next_ch = line[(*pos)+1]; switch (next_ch) { @@ -106,10 +112,22 @@ static MaybeSpecialToken recognize_spec_token(char* line, size_t* pos) { return (MaybeSpecialToken){.some = false}; case '>': *pos += 2; - return (MaybeSpecialToken){.some = true, .value = SPEC_REDIR_W_APPEND}; + return (MaybeSpecialToken){ + .some = true, + .value = (SpecialToken){ + .kind = SPEC_OP, + .as.op = OP_REDIR_W_APPEND, + } + }; default: (*pos)++; - return (MaybeSpecialToken){.some = true, .value = SPEC_REDIR_W_TRUNC}; + return (MaybeSpecialToken){ + .some = true, + .value = (SpecialToken){ + .kind = SPEC_OP, + .as.op = OP_REDIR_W_TRUNC, + } + }; } case '<': next_ch = line[(*pos)+1]; @@ -117,7 +135,13 @@ static MaybeSpecialToken recognize_spec_token(char* line, size_t* pos) { return (MaybeSpecialToken){.some = false}; } else { (*pos)++; - return (MaybeSpecialToken){.some = true, .value = SPEC_REDIR_R}; + return (MaybeSpecialToken){ + .some = true, + .value = (SpecialToken){ + .kind = SPEC_OP, + .as.op = OP_REDIR_R, + } + }; } default: return (MaybeSpecialToken){.some = false}; @@ -157,8 +181,11 @@ TokenVec* lex_level(char* line, size_t* pos, char until, TokenVecVec* tok_seq_po 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 + .kind = TOK_SPEC, + .as.spec = (SpecialToken){ + .kind = SPEC_SUB_IN, + .as.proc_sub_region = sub_toks + } }); } else if (line[*pos] == '>' && line[(*pos)+1] == '(') { *pos += 2; @@ -169,8 +196,11 @@ TokenVec* lex_level(char* line, size_t* pos, char until, TokenVecVec* tok_seq_po 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 + .kind = TOK_SPEC, + .as.spec = (SpecialToken){ + .kind = SPEC_SUB_OUT, + .as.proc_sub_region = sub_toks + } }); } else { push_to_String(&buf.lit_germ, line[(*pos)++]); @@ -182,7 +212,7 @@ TokenVec* lex_level(char* line, size_t* pos, char until, TokenVecVec* tok_seq_po } if (until == '\0') { - push_to_TokenVec(&tokens, (Token){.kind = TOK_SPEC, .as.spec = SPEC_EOL}); + push_to_TokenVec(&tokens, (Token){.kind = TOK_SPEC, .as.spec = (SpecialToken){.kind = SPEC_OP, .as.op = OP_EOL}}); } return push_to_TokenVecVec(tok_seq_pool, tokens); } diff --git a/redes/preproc.c b/redes/preproc.c index f8e65cf..428ff69 100644 --- a/redes/preproc.c +++ b/redes/preproc.c @@ -53,7 +53,7 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) { for (; ( curr_tok = *get_from_TokenVec(&tokens, tok_pos), - !(curr_tok.kind == TOK_SPEC && (curr_tok.as.spec == SPEC_PIPE || curr_tok.as.spec == SPEC_EOL)) + !(curr_tok.kind == TOK_SPEC && curr_tok.as.spec.kind == SPEC_OP && (curr_tok.as.spec.as.op == OP_PIPE || curr_tok.as.spec.as.op == OP_EOL)) ); tok_pos++ ) { @@ -66,22 +66,17 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) { push_to_ArgVec(&pl_cmd.args, (Arg){.kind = ARG_LIT, .as.lit_str = arg_str}); } break; - case TOK_SPEC: - switch (curr_tok.as.spec) { - - } - break; default: exit(68); // TODO: the other kinds } } Token delim_tok = *get_from_TokenVec(&tokens, tok_pos++); - assert(delim_tok.kind == TOK_SPEC); - switch (delim_tok.as.spec) { - case SPEC_PIPE: + assert(delim_tok.kind == TOK_SPEC && delim_tok.as.spec.kind == SPEC_OP); + switch (delim_tok.as.spec.as.op) { + case OP_PIPE: pl_cmd.conn = CONN_PIPE; break; - case SPEC_EOL: + case OP_EOL: pl_cmd.conn = CONN_EOL; break; default: diff --git a/redes/syntax.h b/redes/syntax.h index c40a3da..0cdb76c 100644 --- a/redes/syntax.h +++ b/redes/syntax.h @@ -69,18 +69,32 @@ DECLARE_VEC(Chunk, Word) typedef enum { TOK_WORD, TOK_SPEC, - TOK_SUB_IN, - TOK_SUB_OUT, } TokenKind; typedef enum { - SPEC_PIPE, - SPEC_REDIR_W_TRUNC, - SPEC_REDIR_W_APPEND, - SPEC_REDIR_R, - SPEC_EOL, + OP_PIPE, + OP_REDIR_W_TRUNC, + OP_REDIR_W_APPEND, + OP_REDIR_R, + OP_EOL, +} OperatorToken; + + +typedef enum { + SPEC_OP, + SPEC_SUB_IN, + SPEC_SUB_OUT, +} SpecialTokenKind; + +typedef struct { + SpecialTokenKind kind; + union { + OperatorToken op; + void* proc_sub_region; + } as; } SpecialToken; + typedef struct Token Token; DECLARE_VEC(Token*, TokenPtrVec) @@ -89,7 +103,6 @@ struct Token { union { Word word; SpecialToken spec; - void* procsub_token_vec; } as; }; -- cgit v1.2.3