summaryrefslogtreecommitdiff
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
parentb4f4959d8401af0b68cc00ba199a6ef73cab21e5 (diff)
adjust parsing for the lex redesign
-rw-r--r--main.c11
-rw-r--r--parse.c32
-rw-r--r--parse.h2
3 files changed, 22 insertions, 23 deletions
diff --git a/main.c b/main.c
index a3fb4ec..923fa68 100644
--- a/main.c
+++ b/main.c
@@ -21,11 +21,16 @@ int main() {
.chunks = make_ChunkVec(256),
.regions = make_RegionVec(256),
};
- TokenPtrVec line_toks = lex(line, &arena);
- /*
- Pipeline pl = parse_tokstream(res.top_tokens);
+ TokenPtrVec line_tok_ptrs = lex(line, &arena);
+ Token* tokstream = malloc(sizeof(Token) * line_tok_ptrs.count);
+ for (int i = 0; i < line_tok_ptrs.count; i++) {
+ tokstream[i] = **get_from_TokenPtrVec(&line_tok_ptrs, i);
+ }
+ Pipeline pl = parse_tokstream(tokstream);
+ /*
run_pipeline(pl, &shstate);
*/
+ free(tokstream);
}
free(line);
}
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;
}
diff --git a/parse.h b/parse.h
index 340fb9e..bd088c3 100644
--- a/parse.h
+++ b/parse.h
@@ -46,7 +46,7 @@ typedef struct {
DECLARE_VEC(PipelineElement, Pipeline)
-Pipeline parse_tokstream(TokenVec toks);
+Pipeline parse_tokstream(Token* tokstream);