diff options
| author | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-18 12:07:40 +0200 |
|---|---|---|
| committer | Ákos Kőrösi <korakos99@gmail.com> | 2026-05-18 12:07:40 +0200 |
| commit | c871db694f849075dd3f6637abd424272f112af5 (patch) | |
| tree | 54f9b54d93ccdc3e8d62acbdf9d9b6dca56ec4ab /parse.c | |
| parent | b4f4959d8401af0b68cc00ba199a6ef73cab21e5 (diff) | |
adjust parsing for the lex redesign
Diffstat (limited to 'parse.c')
| -rw-r--r-- | parse.c | 32 |
1 files changed, 13 insertions, 19 deletions
@@ -5,40 +5,34 @@ #include "parse.h" -typedef struct { - TokenVec vec; - size_t pos; -} TokStream; - - -Connector parse_connector(TokStream* toks) { - Token tok = *get_from_TokenVec(&toks->vec, toks->pos); +Connector parse_connector(Token* toks, size_t* tok_pos) { + Token tok = toks[*tok_pos]; if (tok.kind != TOK_SPECIAL) exit(67); switch (tok.as.spec) { case PIPE: - toks->pos++; + (*tok_pos)++; return CONN_PIPE; case EOL: - toks->pos++; + (*tok_pos)++; return CONN_EOL; default: exit(76); } } -Command parse_command(TokStream* toks) { +Command parse_command(Token* toks, size_t* tok_pos) { TokenVec args = make_TokenVec(256); RedirectVec redirects = make_RedirectVec(256); while (true) { - Token curr_tok = *get_from_TokenVec(&toks->vec, toks->pos); + Token curr_tok = toks[*tok_pos]; if (curr_tok.kind == TOK_SPECIAL &&(curr_tok.as.spec == PIPE || curr_tok.as.spec == EOL)) { break; } switch (curr_tok.kind) { case TOK_SPECIAL: - toks->pos++; - Token name_tok = *get_from_TokenVec(&toks->vec, toks->pos); + (*tok_pos)++; + Token name_tok = toks[*tok_pos]; switch (curr_tok.as.spec) { case WRITE_REDIR_TRUNC: if(name_tok.kind != TOK_WORD) exit(1); @@ -59,18 +53,18 @@ Command parse_command(TokStream* toks) { default: push_to_TokenVec(&args, curr_tok); } - toks->pos++; + (*tok_pos)++; } return (Command){.args = args, .redirects = redirects}; } -Pipeline parse_tokstream(TokenVec tok_vec) { - TokStream tokstream = {.vec = tok_vec, .pos = 0}; +Pipeline parse_tokstream(Token* toks) { + size_t tok_pos = 0; Pipeline result = make_Pipeline(256); while (true) { - Command cmd = parse_command(&tokstream); - Connector conn = parse_connector(&tokstream); + Command cmd = parse_command(toks, &tok_pos); + Connector conn = parse_connector(toks, &tok_pos); push_to_Pipeline(&result, (PipelineElement){.cmd = cmd, .conn = conn}); if (conn == CONN_EOL) break; } |
