summaryrefslogtreecommitdiff
path: root/lex.h
blob: e5d843fd8e4686b152b06b7c4b6bc1f6c597560e (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef LEX_H
#define LEX_H

#include "typeutils.h"


typedef struct Region Region;


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;
        Region* reg_ptr;
        char* varname;
    } as;
} Chunk;


DECLARE_VEC(Chunk, Word)

DECLARE_VEC(Word, WordVec)

typedef enum {
    TOK_WORD,
    TOK_SPECIAL,
    TOK_PROCSUB_IN,
    TOK_PROCSUB_OUT,
} TokenKind;

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

typedef struct {
    TokenKind kind;

    union {
        Word word;
        SpecialToken spec; 
        Region* procsub_region;
    } as;
} Token;
    

DECLARE_VEC(Token, TokenVec)

DECLARE_MAYBE(SpecialToken, MaybeSpecialToken)  

typedef enum {
    CMDS,
    ARITHM,
} RegionMode;

struct Region {
    RegionMode mode;
    TokenVec tokens; 
};

DECLARE_MAYBE(Chunk, MaybeChunk);

DECLARE_VEC(Region, RegionVec)


typedef struct {
    TokenVec top_tokens;
    RegionVec reg_arena;
} LexResult;


LexResult lex(char* input);

#endif