X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=lexer.h;h=76d2b7a711c9ce8f5a2e8ddf704778328c92bb70;hb=b1c27e3bf2ed785d693ab3332528bde058a067d0;hp=8d525a5db5e54eb507ba35a6def53ff162f365ad;hpb=415816e4dc9b76cb52386fb4abbae94d45420f9a;p=xonotic%2Fgmqcc.git diff --git a/lexer.h b/lexer.h index 8d525a5..76d2b7a 100644 --- a/lexer.h +++ b/lexer.h @@ -8,7 +8,7 @@ typedef struct token_s token; struct token_s { int ttype; - MEM_VECTOR_MAKE(char, value); + char *value; union { vector v; @@ -57,6 +57,9 @@ enum { TOKEN_INTCONST, TOKEN_FLOATCONST, + TOKEN_WHITE, + TOKEN_EOL, + TOKEN_EOF, /* We use '< TOKEN_ERROR', so TOKEN_FATAL must come after it and any @@ -78,6 +81,8 @@ static const char *_tokennames[] = { "TOKEN_VECTORCONST", "TOKEN_INTCONST", "TOKEN_FLOATCONST", + "TOKEN_WHITE", + "TOKEN_EOL", "TOKEN_EOF", "TOKEN_ERROR", "TOKEN_FATAL", @@ -95,6 +100,10 @@ typedef struct { typedef struct { FILE *file; + const char *open_string; + size_t open_string_length; + size_t open_string_pos; + char *name; size_t line; size_t sline; /* line at the start of a token */ @@ -109,16 +118,16 @@ typedef struct { struct { bool noops; bool nodigraphs; /* used when lexing string constants */ + bool preprocessing; /* whitespace and EOLs become actual tokens */ } flags; int framevalue; - MEM_VECTOR_MAKE(frame_macro, frames); + frame_macro *frames; char *modelname; } lex_file; -MEM_VECTOR_PROTO(lex_file, char, token); - lex_file* lex_open (const char *file); +lex_file* lex_open_string(const char *str, size_t len, const char *name); void lex_close(lex_file *lex); int lex_do (lex_file *lex); void lex_cleanup(void); @@ -156,6 +165,7 @@ static const oper_info c_operators[] = { { ".", 2, opid1('.'), ASSOC_LEFT, 15, 0 }, { "(", 0, opid1('('), ASSOC_LEFT, 15, 0 }, /* function call */ + { "[", 2, opid1('['), ASSOC_LEFT, 15, 0 }, /* array subscript */ { "!", 1, opid2('!', 'P'), ASSOC_RIGHT, 14, OP_PREFIX }, { "~", 1, opid2('~', 'P'), ASSOC_RIGHT, 14, OP_PREFIX }, @@ -216,6 +226,7 @@ static const oper_info qcc_operators[] = { { ".", 2, opid1('.'), ASSOC_LEFT, 15, 0 }, { "(", 0, opid1('('), ASSOC_LEFT, 15, 0 }, /* function call */ + { "[", 2, opid1('['), ASSOC_LEFT, 15, 0 }, /* array subscript */ { "!", 1, opid2('!', 'P'), ASSOC_RIGHT, 14, OP_PREFIX }, { "+", 1, opid2('+','P'), ASSOC_RIGHT, 14, OP_PREFIX },