summaryrefslogtreecommitdiff
path: root/lex.h
blob: b777d954902f1b8e177e03ea03ac917096933c7c (plain)
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
#include "typeutils.h"


typedef struct ExpansionRegion ExpansionRegion;


typedef enum {
    UN_Q,
    SINGLE_Q,
    DOUBLE_Q,
} QuotationMode;

typedef enum {
    LITERAL,
    REGION_EXP,
    VAR_EXP,    // TODO: Later include other exps
} ChunkKind;

typedef struct {
    ChunkKind kind;
    QuotationMode qmode;
    union {
        char* literal_str;
        ExpansionRegion* reg_ptr;
        char* varname;
    } as;
} Chunk;


DECLARE_VEC(Chunk, ChunkVec)

typedef enum {
    TOK_WORD,
    TOK_SPECIAL,
} TokenKind;

typedef enum {
    PIPE,
    WRITE_REDIR_TRUNC,
    WRITE_REDIR_APPEND,
    READ_REDIR,
    L_PROC_SUB_IN,
    L_PROC_SUB_OUT,
    PAREN,
    EOL,
} SpecialToken;

typedef struct {
    TokenKind kind;

    union {
        ChunkVec word;
        SpecialToken spec; 
    } as;
} Token;
    

DECLARE_VEC(Token, TokenVec)

DECLARE_MAYBE(SpecialToken)  

typedef enum {
    CMD_SUB,
    ARITHM,
} RegionMode;

struct ExpansionRegion {
    RegionMode mode;
    TokenVec tokens; 
};

DECLARE_MAYBE(Chunk);

DECLARE_VEC(ExpansionRegion, ExpansionRegionVec)