1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# pragma once
#include "utils.h"
typedef enum {
PLUS,
MINUS,
MULT,
DIV,
} BinOp;
typedef enum {
ARITHM_INT_LIT,
ARITHM_BINOP,
} ArithmNodeKind;
typedef struct ArithmNode ArithmNode;
struct ArithmNode {
ArithmNodeKind kind;
union {
int lit_val;
struct {
BinOp op;
ArithmNode* left;
ArithmNode* right;
} binop;
} as;
};
DECLARE_VEC(ArithmNode, ArithmNodeVec)
typedef struct {
ArithmNodeVec nodes;
ArithmNode* root;
} ArithmAst;
typedef enum {
UN_Q,
SINGLE_Q,
DOUBLE_Q,
} QuotationMode;
typedef enum {
CHUNK_LIT,
CHUNK_VAR,
CHUNK_CMDSUB,
CHUNK_ARITHM,
} ChunkKind;
typedef struct {
QuotationMode qmode;
ChunkKind kind;
union {
char* lit_str;
char* varname;
ArithmAst arithm_expr;
// TODO: CHUNK_CMDSUB
} as;
} Chunk;
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,
} SpecialToken;
typedef struct Token Token;
DECLARE_VEC(Token*, TokenPtrVec)
struct Token {
TokenKind kind;
union {
Word word;
SpecialToken spec;
TokenPtrVec procsub_toks;
} as;
};
DECLARE_VEC(Token, TokenVec)
typedef struct {
TokenVec token_pool;
TokenPtrVec top_tokens;
} Ast;
|