#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