X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=lexer.h;h=f2933455723b0075e01ddf43c2c0619abc5ceb9b;hb=5867167a70c1fce8575b632aeefbd368051f0827;hp=b8e2e01f8449c1654ae298ffcff3181f6d58d5cb;hpb=79abe3fb6d9cf6c0d5f234d64fd77181b2c2317d;p=xonotic%2Fgmqcc.git diff --git a/lexer.h b/lexer.h index b8e2e01..f293345 100644 --- a/lexer.h +++ b/lexer.h @@ -69,30 +69,6 @@ enum { TOKEN_FATAL /* internal error, eg out of memory */ }; -static const char *_tokennames[] = { - "TOKEN_START", - "TOKEN_IDENT", - "TOKEN_TYPENAME", - "TOKEN_OPERATOR", - "TOKEN_KEYWORD", - "TOKEN_DOTS", - "TOKEN_STRINGCONST", - "TOKEN_CHARCONST", - "TOKEN_VECTORCONST", - "TOKEN_INTCONST", - "TOKEN_FLOATCONST", - "TOKEN_WHITE", - "TOKEN_EOL", - "TOKEN_EOF", - "TOKEN_ERROR", - "TOKEN_FATAL", -}; -typedef int -_all_tokennames_added_[ - ((TOKEN_FATAL - TOKEN_START + 1) == - (sizeof(_tokennames)/sizeof(_tokennames[0]))) - ? 1 : -1]; - typedef struct { char *name; int value; @@ -125,6 +101,8 @@ typedef struct { int framevalue; frame_macro *frames; char *modelname; + + size_t push_line; } lex_file; lex_file* lex_open (const char *file); @@ -161,9 +139,8 @@ typedef struct { static const oper_info c_operators[] = { { "(", 0, opid1('('), ASSOC_LEFT, 99, OP_PREFIX}, /* paren expression - non function call */ - { "++", 1, opid3('S','+','+'), ASSOC_LEFT, 16, OP_SUFFIX}, - { "--", 1, opid3('S','-','-'), ASSOC_LEFT, 16, OP_SUFFIX}, - + { "++", 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 */ @@ -205,6 +182,7 @@ static const oper_info c_operators[] = { { "||", 2, opid2('|','|'), ASSOC_LEFT, 4, 0 }, { "?", 3, opid2('?',':'), ASSOC_RIGHT, 3, 0 }, + { ":", 3, opid2(':','?'), ASSOC_RIGHT, 3, 0 }, { "=", 2, opid1('='), ASSOC_RIGHT, 2, 0 }, { "+=", 2, opid2('+','='), ASSOC_RIGHT, 2, 0 }, @@ -222,6 +200,55 @@ static const oper_info c_operators[] = { }; static const size_t c_operator_count = (sizeof(c_operators) / sizeof(c_operators[0])); +static const oper_info fte_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, 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 }, + + { "*", 2, opid1('*'), ASSOC_LEFT, 13, 0 }, + { "/", 2, opid1('/'), ASSOC_LEFT, 13, 0 }, + { "&", 2, opid1('&'), ASSOC_LEFT, 13, 0 }, + { "|", 2, opid1('|'), ASSOC_LEFT, 13, 0 }, + + { "+", 2, opid1('+'), ASSOC_LEFT, 12, 0 }, + { "-", 2, opid1('-'), ASSOC_LEFT, 12, 0 }, + + { "<", 2, opid1('<'), ASSOC_LEFT, 10, 0 }, + { ">", 2, opid1('>'), ASSOC_LEFT, 10, 0 }, + { "<=", 2, opid2('<','='), ASSOC_LEFT, 10, 0 }, + { ">=", 2, opid2('>','='), ASSOC_LEFT, 10, 0 }, + { "==", 2, opid2('=','='), ASSOC_LEFT, 10, 0 }, + { "!=", 2, opid2('!','='), ASSOC_LEFT, 10, 0 }, + + { "=", 2, opid1('='), ASSOC_RIGHT, 8, 0 }, + { "+=", 2, opid2('+','='), ASSOC_RIGHT, 8, 0 }, + { "-=", 2, opid2('-','='), ASSOC_RIGHT, 8, 0 }, + { "*=", 2, opid2('*','='), ASSOC_RIGHT, 8, 0 }, + { "/=", 2, opid2('/','='), ASSOC_RIGHT, 8, 0 }, + { "%=", 2, opid2('%','='), ASSOC_RIGHT, 8, 0 }, + { "&=", 2, opid2('&','='), ASSOC_RIGHT, 8, 0 }, + { "|=", 2, opid2('|','='), ASSOC_RIGHT, 8, 0 }, + + { "&&", 2, opid2('&','&'), ASSOC_LEFT, 5, 0 }, + { "||", 2, opid2('|','|'), ASSOC_LEFT, 5, 0 }, + + { ",", 2, opid1(','), ASSOC_LEFT, 2, 0 }, + + { "?", 3, opid2('?',':'), ASSOC_RIGHT, 1, 0 }, + { ":", 3, opid2(':','?'), ASSOC_RIGHT, 1, 0 } +}; +static const size_t fte_operator_count = (sizeof(fte_operators) / sizeof(fte_operators[0])); + static const oper_info qcc_operators[] = { { "(", 0, opid1('('), ASSOC_LEFT, 99, OP_PREFIX}, /* paren expression - non function call */ @@ -260,7 +287,10 @@ static const oper_info qcc_operators[] = { { "&&", 2, opid2('&','&'), ASSOC_LEFT, 5, 0 }, { "||", 2, opid2('|','|'), ASSOC_LEFT, 5, 0 }, - { ",", 2, opid1(','), ASSOC_LEFT, 1, 0 } + { ",", 2, opid1(','), ASSOC_LEFT, 2, 0 }, + + { "?", 3, opid2('?',':'), ASSOC_RIGHT, 1, 0 }, + { ":", 3, opid2(':','?'), ASSOC_RIGHT, 1, 0 } }; static const size_t qcc_operator_count = (sizeof(qcc_operators) / sizeof(qcc_operators[0]));