summaryrefslogtreecommitdiff
path: root/parse.c
diff options
context:
space:
mode:
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
commitc871db694f849075dd3f6637abd424272f112af5 (patch)
tree54f9b54d93ccdc3e8d62acbdf9d9b6dca56ec4ab /parse.c
parentb4f4959d8401af0b68cc00ba199a6ef73cab21e5 (diff)
adjust parsing for the lex redesign
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/parse.c b/parse.c
index 7f11022..2cf74c6 100644
--- a/parse.c
+++ b/parse.c
@@ -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;
}