From a668be570b3b1b1d4c8a7e85159eece4080217c1 Mon Sep 17 00:00:00 2001 From: Ákos Kőrösi Date: Tue, 12 May 2026 12:25:14 +0200 Subject: outline a bit of parsing --- parse.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 parse.c (limited to 'parse.c') diff --git a/parse.c b/parse.c new file mode 100644 index 0000000..c1f1bb8 --- /dev/null +++ b/parse.c @@ -0,0 +1,68 @@ +#include "typeutils.h" +#include "lex.h" + +DECLARE_VEC(char*, StrVec) + + +typedef struct { + TokenVec tokens; + size_t pos; +} TokStream; + +typedef enum { + STDIN_REDIR, + STDOUT_REDIT, +} RedirKind; + + +typedef struct { + RedirKind kind; + + union { + char* std_redir_filename; + } as; +} Redirect; +DECLARE_VEC(Redirect, RedirectVec) + + +typedef struct { + StrVec args; + RedirectVec redirects; + // TODO: prefix variable settings +} Command; + + +typedef enum { + CONN_PIPE, + CONN_EOL, + // TODO: add the |& thingy +} Connector; + + +typedef struct { + Command cmd; + Connector conn; +} PipelineElement; + + +DECLARE_VEC(PipelineElement, Pipeline) + + +Command parse_command(TokStream* toks) { + StrVec args = make_StrVec(256); + RedirectVec redirects = make_RedirectVec(256); + for ( + Token curr_tok; + (curr_tok = toks->tokens.items[toks->pos], !(curr_tok.kind == TOK_SPECIAL && (curr_tok.as.spec == PIPE && curr_tok.as.spec == EOL))); + toks->pos++ + ) { + if (curr_tok.kind == TOK_SPECIAL) { + } + } +} + + +Pipeline parse_tokstream(TokenVec toks) { + TokStream tokstream = {.tokens = toks, .pos = 0}; + Pipeline result = make_Pipeline(256); +} -- cgit v1.2.3