summaryrefslogtreecommitdiff
path: root/syntax.h
blob: b3957050788654050d52288fec2d9ed031a1dd28 (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
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;