X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=lexer.h;h=efbdd6490dc54061969a6a715af1c01b21fedd0f;hp=75fb83e9320fc159d432819c408b3abf339270c7;hb=d6ca5673dc7f2760faca1200477808d919a290ca;hpb=b4fbba5708486f80e4109a2bf62ce04e48b86d04 diff --git a/lexer.h b/lexer.h index 75fb83e..efbdd64 100644 --- a/lexer.h +++ b/lexer.h @@ -22,7 +22,6 @@ */ #ifndef GMQCC_LEXER_HDR #define GMQCC_LEXER_HDR - typedef struct token_s token; struct token_s { @@ -31,7 +30,7 @@ struct token_s { char *value; union { - vector v; + vec3_t v; int i; double f; int t; /* type */ @@ -42,7 +41,7 @@ struct token_s { struct token_s *prev; #endif - lex_ctx ctx; + lex_ctx_t ctx; }; #if 0 @@ -76,6 +75,7 @@ enum { TOKEN_VA_ARGS, /* for the ftepp only */ TOKEN_VA_ARGS_ARRAY, /* for the ftepp only */ + TOKEN_VA_COUNT, /* to get the count of vaargs */ TOKEN_STRINGCONST, /* not the typename but an actual "string" */ TOKEN_CHARCONST, @@ -86,7 +86,11 @@ enum { TOKEN_WHITE, TOKEN_EOL, - TOKEN_EOF, + /* if we add additional tokens before this, the exposed API + * should not be broken anyway, but EOF/ERROR/... should + * still be at the bottom + */ + TOKEN_EOF = 1024, /* We use '< TOKEN_ERROR', so TOKEN_FATAL must come after it and any * other error related tokens as well @@ -109,6 +113,7 @@ typedef struct lex_file_s { char *name; size_t line; size_t sline; /* line at the start of a token */ + size_t column; int peek[256]; size_t peekpos; @@ -118,11 +123,11 @@ typedef struct lex_file_s { token tok; /* not a pointer anymore */ struct { - bool noops; - bool nodigraphs; /* used when lexing string constants */ - bool preprocessing; /* whitespace and EOLs become actual tokens */ - bool mergelines; /* backslash at the end of a line escapes the newline */ - } flags; + unsigned noops:1; + unsigned nodigraphs:1; /* used when lexing string constants */ + unsigned preprocessing:1; /* whitespace and EOLs become actual tokens */ + unsigned mergelines:1; /* backslash at the end of a line escapes the newline */ + } flags; /* sizeof == 1 */ int framevalue; frame_macro *frames; @@ -158,25 +163,33 @@ typedef struct { unsigned int flags; } oper_info; -#define opid1(a) (a) -#define opid2(a,b) ((a<<8)|b) -#define opid3(a,b,c) ((a<<16)|(b<<8)|c) +/* + * Explicit uint8_t casts since the left operand of shift operator cannot + * be negative, even though it won't happen, this supresses the future + * possibility. + */ +#define opid1(a) ((uint8_t)a) +#define opid2(a,b) (((uint8_t)a<<8) |(uint8_t)b) +#define opid3(a,b,c) (((uint8_t)a<<16)|((uint8_t)b<<8)|(uint8_t)c) static const oper_info c_operators[] = { { "(", 0, opid1('('), ASSOC_LEFT, 99, OP_PREFIX}, /* paren expression - non function call */ - { "++", 1, opid3('S','+','+'), ASSOC_LEFT, 15, OP_SUFFIX}, - { "--", 1, opid3('S','-','-'), ASSOC_LEFT, 15, OP_SUFFIX}, - { ".", 2, opid1('.'), ASSOC_LEFT, 15, 0 }, - { "(", 0, opid1('('), ASSOC_LEFT, 15, 0 }, /* function call */ - { "[", 2, opid1('['), ASSOC_LEFT, 15, 0 }, /* array subscript */ + { "++", 1, opid3('S','+','+'), ASSOC_LEFT, 17, OP_SUFFIX}, + { "--", 1, opid3('S','-','-'), ASSOC_LEFT, 17, OP_SUFFIX}, + { ".", 2, opid1('.'), ASSOC_LEFT, 17, 0 }, + { "(", 0, opid1('('), ASSOC_LEFT, 17, 0 }, /* function call */ + { "[", 2, opid1('['), ASSOC_LEFT, 17, 0 }, /* array subscript */ + + { "++", 1, opid3('+','+','P'), ASSOC_RIGHT, 16, OP_PREFIX }, + { "--", 1, opid3('-','-','P'), ASSOC_RIGHT, 16, OP_PREFIX }, + + { "**", 2, opid2('*', '*'), ASSOC_RIGHT, 15, 0 }, { "!", 1, opid2('!', 'P'), ASSOC_RIGHT, 14, OP_PREFIX }, { "~", 1, opid2('~', 'P'), ASSOC_RIGHT, 14, OP_PREFIX }, { "+", 1, opid2('+','P'), ASSOC_RIGHT, 14, OP_PREFIX }, { "-", 1, opid2('-','P'), ASSOC_RIGHT, 14, OP_PREFIX }, - { "++", 1, opid3('+','+','P'), ASSOC_RIGHT, 14, OP_PREFIX }, - { "--", 1, opid3('-','-','P'), ASSOC_RIGHT, 14, OP_PREFIX }, /* { "&", 1, opid2('&','P'), ASSOC_RIGHT, 14, OP_PREFIX }, */ { "*", 2, opid1('*'), ASSOC_LEFT, 13, 0 }, @@ -191,6 +204,7 @@ static const oper_info c_operators[] = { { "<", 2, opid1('<'), ASSOC_LEFT, 10, 0 }, { ">", 2, opid1('>'), ASSOC_LEFT, 10, 0 }, + { "<=>", 2, opid3('<','=','>'), ASSOC_LEFT, 10, 0 }, { "<=", 2, opid2('<','='), ASSOC_LEFT, 10, 0 }, { ">=", 2, opid2('>','='), ASSOC_LEFT, 10, 0 }, @@ -326,6 +340,6 @@ static const size_t qcc_operator_count = (sizeof(qcc_operators) / sizeof(qcc_ope extern const oper_info *operators; extern size_t operator_count; -void lexerror(lex_file*, const char *fmt, ...); +/*void lexerror(lex_file*, const char *fmt, ...);*/ #endif