summaryrefslogtreecommitdiff
path: root/redes
diff options
context:
space:
mode:
authorÁkos Kőrösi <korakos99@gmail.com>2026-05-21 11:53:45 +0200
committerÁkos Kőrösi <korakos99@gmail.com>2026-05-21 11:53:45 +0200
commit0cf6fc7cc6581e8a01e2d475858fec7b352fe4d0 (patch)
tree5f330dda5666b3edee8694f3e64493fb4fec4914 /redes
parentfdaf99196bc9c69d26a7ed5b7431528b4a0bd053 (diff)
redesign token types, pipes don't work now
Diffstat (limited to 'redes')
-rw-r--r--redes/lexparse.c48
-rw-r--r--redes/preproc.c15
-rw-r--r--redes/syntax.h29
3 files changed, 65 insertions, 27 deletions
diff --git a/redes/lexparse.c b/redes/lexparse.c
index e064229..4b0fffc 100644
--- a/redes/lexparse.c
+++ b/redes/lexparse.c
@@ -98,7 +98,13 @@ static MaybeSpecialToken recognize_spec_token(char* line, size_t* pos) {
switch (line[*pos]) {
case '|':
(*pos)++;
- return (MaybeSpecialToken){.some = true, .value = SPEC_PIPE};
+ return (MaybeSpecialToken){
+ .some = true,
+ .value = (SpecialToken){
+ .kind = SPEC_OP,
+ .as.op = OP_PIPE,
+ }
+ };
case '>':
next_ch = line[(*pos)+1];
switch (next_ch) {
@@ -106,10 +112,22 @@ static MaybeSpecialToken recognize_spec_token(char* line, size_t* pos) {
return (MaybeSpecialToken){.some = false};
case '>':
*pos += 2;
- return (MaybeSpecialToken){.some = true, .value = SPEC_REDIR_W_APPEND};
+ return (MaybeSpecialToken){
+ .some = true,
+ .value = (SpecialToken){
+ .kind = SPEC_OP,
+ .as.op = OP_REDIR_W_APPEND,
+ }
+ };
default:
(*pos)++;
- return (MaybeSpecialToken){.some = true, .value = SPEC_REDIR_W_TRUNC};
+ return (MaybeSpecialToken){
+ .some = true,
+ .value = (SpecialToken){
+ .kind = SPEC_OP,
+ .as.op = OP_REDIR_W_TRUNC,
+ }
+ };
}
case '<':
next_ch = line[(*pos)+1];
@@ -117,7 +135,13 @@ static MaybeSpecialToken recognize_spec_token(char* line, size_t* pos) {
return (MaybeSpecialToken){.some = false};
} else {
(*pos)++;
- return (MaybeSpecialToken){.some = true, .value = SPEC_REDIR_R};
+ return (MaybeSpecialToken){
+ .some = true,
+ .value = (SpecialToken){
+ .kind = SPEC_OP,
+ .as.op = OP_REDIR_R,
+ }
+ };
}
default:
return (MaybeSpecialToken){.some = false};
@@ -157,8 +181,11 @@ TokenVec* lex_level(char* line, size_t* pos, char until, TokenVecVec* tok_seq_po
TokenVec* sub_toks = lex_level(line, pos, ')', tok_seq_pool);
(*pos)++;
push_to_TokenVec(&tokens, (Token){
- .kind = TOK_SUB_IN,
- .as.procsub_token_vec = sub_toks
+ .kind = TOK_SPEC,
+ .as.spec = (SpecialToken){
+ .kind = SPEC_SUB_IN,
+ .as.proc_sub_region = sub_toks
+ }
});
} else if (line[*pos] == '>' && line[(*pos)+1] == '(') {
*pos += 2;
@@ -169,8 +196,11 @@ TokenVec* lex_level(char* line, size_t* pos, char until, TokenVecVec* tok_seq_po
TokenVec* sub_toks = lex_level(line, pos, ')', tok_seq_pool);
(*pos)++;
push_to_TokenVec(&tokens, (Token){
- .kind = TOK_SUB_OUT,
- .as.procsub_token_vec = sub_toks
+ .kind = TOK_SPEC,
+ .as.spec = (SpecialToken){
+ .kind = SPEC_SUB_OUT,
+ .as.proc_sub_region = sub_toks
+ }
});
} else {
push_to_String(&buf.lit_germ, line[(*pos)++]);
@@ -182,7 +212,7 @@ TokenVec* lex_level(char* line, size_t* pos, char until, TokenVecVec* tok_seq_po
}
if (until == '\0') {
- push_to_TokenVec(&tokens, (Token){.kind = TOK_SPEC, .as.spec = SPEC_EOL});
+ push_to_TokenVec(&tokens, (Token){.kind = TOK_SPEC, .as.spec = (SpecialToken){.kind = SPEC_OP, .as.op = OP_EOL}});
}
return push_to_TokenVecVec(tok_seq_pool, tokens);
}
diff --git a/redes/preproc.c b/redes/preproc.c
index f8e65cf..428ff69 100644
--- a/redes/preproc.c
+++ b/redes/preproc.c
@@ -53,7 +53,7 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
for (;
(
curr_tok = *get_from_TokenVec(&tokens, tok_pos),
- !(curr_tok.kind == TOK_SPEC && (curr_tok.as.spec == SPEC_PIPE || curr_tok.as.spec == SPEC_EOL))
+ !(curr_tok.kind == TOK_SPEC && curr_tok.as.spec.kind == SPEC_OP && (curr_tok.as.spec.as.op == OP_PIPE || curr_tok.as.spec.as.op == OP_EOL))
);
tok_pos++
) {
@@ -66,22 +66,17 @@ Pipeline* process_token_sequence(TokenVec tokens, PipelineVec* pl_pool) {
push_to_ArgVec(&pl_cmd.args, (Arg){.kind = ARG_LIT, .as.lit_str = arg_str});
}
break;
- case TOK_SPEC:
- switch (curr_tok.as.spec) {
-
- }
- break;
default:
exit(68); // TODO: the other kinds
}
}
Token delim_tok = *get_from_TokenVec(&tokens, tok_pos++);
- assert(delim_tok.kind == TOK_SPEC);
- switch (delim_tok.as.spec) {
- case SPEC_PIPE:
+ assert(delim_tok.kind == TOK_SPEC && delim_tok.as.spec.kind == SPEC_OP);
+ switch (delim_tok.as.spec.as.op) {
+ case OP_PIPE:
pl_cmd.conn = CONN_PIPE;
break;
- case SPEC_EOL:
+ case OP_EOL:
pl_cmd.conn = CONN_EOL;
break;
default:
diff --git a/redes/syntax.h b/redes/syntax.h
index c40a3da..0cdb76c 100644
--- a/redes/syntax.h
+++ b/redes/syntax.h
@@ -69,18 +69,32 @@ DECLARE_VEC(Chunk, Word)
typedef enum {
TOK_WORD,
TOK_SPEC,
- TOK_SUB_IN,
- TOK_SUB_OUT,
} TokenKind;
typedef enum {
- SPEC_PIPE,
- SPEC_REDIR_W_TRUNC,
- SPEC_REDIR_W_APPEND,
- SPEC_REDIR_R,
- SPEC_EOL,
+ OP_PIPE,
+ OP_REDIR_W_TRUNC,
+ OP_REDIR_W_APPEND,
+ OP_REDIR_R,
+ OP_EOL,
+} OperatorToken;
+
+
+typedef enum {
+ SPEC_OP,
+ SPEC_SUB_IN,
+ SPEC_SUB_OUT,
+} SpecialTokenKind;
+
+typedef struct {
+ SpecialTokenKind kind;
+ union {
+ OperatorToken op;
+ void* proc_sub_region;
+ } as;
} SpecialToken;
+
typedef struct Token Token;
DECLARE_VEC(Token*, TokenPtrVec)
@@ -89,7 +103,6 @@ struct Token {
union {
Word word;
SpecialToken spec;
- void* procsub_token_vec;
} as;
};