summaryrefslogtreecommitdiff
path: root/parse.c
diff options
context:
space:
mode:
authorÁkos Kőrösi <korakos99@gmail.com>2026-05-12 12:57:20 +0200
committerÁkos Kőrösi <korakos99@gmail.com>2026-05-12 12:57:20 +0200
commit3297384ec22c4931dc86b2429c8afe25b436682d (patch)
treeeeff6e612c84a8cfc0b7f32484a0f4e2ee1da91f /parse.c
parenta668be570b3b1b1d4c8a7e85159eece4080217c1 (diff)
add parsing codes and lexing renames
- outline more sketch code for parsing - rename Region
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c45
1 files changed, 38 insertions, 7 deletions
diff --git a/parse.c b/parse.c
index c1f1bb8..87af679 100644
--- a/parse.c
+++ b/parse.c
@@ -1,3 +1,5 @@
+#include <stdlib.h>
+
#include "typeutils.h"
#include "lex.h"
@@ -5,13 +7,15 @@ DECLARE_VEC(char*, StrVec)
typedef struct {
- TokenVec tokens;
+ Token* ptr;
+ size_t len;
size_t pos;
} TokStream;
typedef enum {
STDIN_REDIR,
- STDOUT_REDIT,
+ STDOUT_REDIR_TRUNC,
+ STDOUT_REDIR_APPEND,
} RedirKind;
@@ -19,14 +23,14 @@ typedef struct {
RedirKind kind;
union {
- char* std_redir_filename;
+ Word std_redir_filename;
} as;
} Redirect;
DECLARE_VEC(Redirect, RedirectVec)
typedef struct {
- StrVec args;
+ WordVec args;
RedirectVec redirects;
// TODO: prefix variable settings
} Command;
@@ -48,21 +52,48 @@ typedef struct {
DECLARE_VEC(PipelineElement, Pipeline)
+
Command parse_command(TokStream* toks) {
- StrVec args = make_StrVec(256);
+ WordVec args = make_WordVec(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)));
+ (curr_tok = toks->ptr[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) {
+ Token tok;
+ switch (curr_tok.as.spec) {
+ case WRITE_REDIR_TRUNC:
+ toks->pos++;
+ tok = toks->ptr[toks->pos];
+ if(tok.kind != TOK_WORD) exit(1);
+ push_to_RedirectVec(&redirects, (Redirect){.kind = STDOUT_REDIR_TRUNC, .as.std_redir_filename = tok.as.word});
+ break;
+ case WRITE_REDIR_APPEND:
+ toks->pos++;
+ tok = toks->ptr[toks->pos];
+ if(tok.kind != TOK_WORD) exit(1);
+ push_to_RedirectVec(&redirects, (Redirect){.kind = STDOUT_REDIR_APPEND, .as.std_redir_filename = tok.as.word});
+ break;
+ case READ_REDIR:
+ toks->pos++;
+ tok = toks->ptr[toks->pos];
+ if(tok.kind != TOK_WORD) exit(1);
+ push_to_RedirectVec(&redirects, (Redirect){.kind = STDOUT_REDIR_APPEND, .as.std_redir_filename = tok.as.word});
+ break;
+ default:
+ exit(69);
+ }
+ } else if (curr_tok.kind == TOK_WORD){
+ push_to_WordVec(&args, curr_tok.as.word);
}
}
+ return (Command){.args = args, .redirects = redirects};
}
Pipeline parse_tokstream(TokenVec toks) {
- TokStream tokstream = {.tokens = toks, .pos = 0};
+ TokStream tokstream = {.ptr = toks.items, .len = toks.count, .pos = 0};
Pipeline result = make_Pipeline(256);
}