summaryrefslogtreecommitdiff
path: root/userland/minibox/utilities/sh/ast.h
diff options
context:
space:
mode:
authorAnton Kling <anton@kling.gg>2023-11-17 23:58:14 +0100
committerAnton Kling <anton@kling.gg>2023-11-17 23:58:14 +0100
commit01a9392ad6051878e217bffeffd6261ccf994c42 (patch)
tree17bb2d06531c32e17396ff6978983e133b79c6df /userland/minibox/utilities/sh/ast.h
parent0c9282bb61b0d7c463045139655b3f1f1ec5422b (diff)
Minibox: Add a somewhat improved shell
This shell actually lexes and produces a AST which makes it easier to add features and will makes it more difficult to introduce bugs. So basically it is just better code.
Diffstat (limited to 'userland/minibox/utilities/sh/ast.h')
-rw-r--r--userland/minibox/utilities/sh/ast.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/userland/minibox/utilities/sh/ast.h b/userland/minibox/utilities/sh/ast.h
new file mode 100644
index 0000000..7e7aaff
--- /dev/null
+++ b/userland/minibox/utilities/sh/ast.h
@@ -0,0 +1,36 @@
+#ifndef AST_H
+#define AST_H
+#include "lexer.h"
+
+typedef enum {
+ AST_VALUE_STRING,
+} ast_value_type_t;
+
+struct AST_VALUE {
+ ast_value_type_t type;
+ union {
+ char *string;
+ };
+};
+
+typedef enum {
+ AST_COMMAND,
+ AST_EXPRESSION,
+ AST_CONDITIONAL_AND,
+ AST_CONDITIONAL_NOT,
+} ast_type_t;
+
+struct AST {
+ ast_type_t type;
+ struct AST_VALUE val;
+ struct AST *children;
+ struct AST *pipe_rhs; // in "func1 | func2" func2 is the piped rhs
+ int file_out_fd_to_use;
+ int file_out_append;
+ const char *file_out; // in "func1 > file.txt" file.txt is the file_out
+ struct AST *next;
+};
+
+void free_ast(struct AST *ast);
+struct AST *generate_ast(struct TOKEN *token);
+#endif // AST_H