#pragma once #include "utils.h" typedef struct Region Region; // Lexing stage 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_MAYBE(Chunk, MaybeChunk); DECLARE_VEC(Chunk*, Word) 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; DECLARE_MAYBE(SpecialToken, MaybeSpecialToken) typedef struct { TokenKind kind; union { Word word; SpecialToken spec; Region* procsub_region; } as; } Token; DECLARE_VEC(Token*, TokenPtrVec) typedef enum { CMDS, ARITHM, } RegionMode; struct Region { RegionMode mode; TokenPtrVec tokens; }; DECLARE_VEC(Region, RegionVec)