X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=lexer.h;h=71ff198eed024b66c1932830d26148cd45e0d514;hb=61b777f5757e5fa085e5a9caa08ba8da2739455d;hp=f2933455723b0075e01ddf43c2c0619abc5ceb9b;hpb=5867167a70c1fce8575b632aeefbd368051f0827;p=xonotic%2Fgmqcc.git diff --git a/lexer.h b/lexer.h index f293345..71ff198 100644 --- a/lexer.h +++ b/lexer.h @@ -1,28 +1,48 @@ -#ifndef GMQCC_LEXER_HDR_ -#define GMQCC_LEXER_HDR_ +/* + * Copyright (C) 2012, 2013 + * Wolfgang Bumiller + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#ifndef GMQCC_LEXER_HDR +#define GMQCC_LEXER_HDR typedef struct token_s token; -#include "ast.h" - struct token_s { - int ttype; + int ttype; - char *value; + char *value; - union { - vector v; - int i; - double f; - int t; /* type */ - } constval; + union { + vector v; + int i; + double f; + int t; /* type */ + } constval; #if 0 - struct token_s *next; - struct token_s *prev; + struct token_s *next; + struct token_s *prev; #endif - lex_ctx ctx; + lex_ctx ctx; }; #if 0 @@ -51,6 +71,11 @@ enum { TOKEN_DOTS, /* 3 dots, ... */ + TOKEN_ATTRIBUTE_OPEN, /* [[ */ + TOKEN_ATTRIBUTE_CLOSE, /* ]] */ + + TOKEN_VA_ARGS, /* for the ftepp only */ + TOKEN_STRINGCONST, /* not the typename but an actual "string" */ TOKEN_CHARCONST, TOKEN_VECTORCONST, @@ -74,35 +99,35 @@ typedef struct { int value; } frame_macro; -typedef struct { - FILE *file; - const char *open_string; - size_t open_string_length; - size_t open_string_pos; +typedef struct lex_file_s { + 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 */ + char *name; + size_t line; + size_t sline; /* line at the start of a token */ - char peek[256]; - size_t peekpos; + int peek[256]; + size_t peekpos; - bool eof; + bool eof; - token tok; /* not a pointer anymore */ + 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; + 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; int framevalue; - frame_macro *frames; - char *modelname; + frame_macro *frames; + char *modelname; - size_t push_line; + size_t push_line; } lex_file; lex_file* lex_open (const char *file); @@ -128,7 +153,7 @@ typedef struct { unsigned int operands; unsigned int id; unsigned int assoc; - unsigned int prec; + signed int prec; unsigned int flags; } oper_info; @@ -182,7 +207,6 @@ 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 }, @@ -195,8 +219,11 @@ static const oper_info c_operators[] = { { "&=", 2, opid2('&','='), ASSOC_RIGHT, 2, 0 }, { "^=", 2, opid2('^','='), ASSOC_RIGHT, 2, 0 }, { "|=", 2, opid2('|','='), ASSOC_RIGHT, 2, 0 }, + { "&~=", 2, opid3('&','~','='), ASSOC_RIGHT, 2, 0 }, - { ",", 2, opid1(','), ASSOC_LEFT, 1, 0 } + { ":", 0, opid2(':','?'), ASSOC_RIGHT, 1, 0 }, + + { ",", 2, opid1(','), ASSOC_LEFT, 0, 0 } }; static const size_t c_operator_count = (sizeof(c_operators) / sizeof(c_operators[0])); @@ -223,6 +250,9 @@ static const oper_info fte_operators[] = { { "+", 2, opid1('+'), ASSOC_LEFT, 12, 0 }, { "-", 2, opid1('-'), ASSOC_LEFT, 12, 0 }, + { "<<", 2, opid2('<','<'), ASSOC_LEFT, 11, 0 }, + { ">>", 2, opid2('>','>'), ASSOC_LEFT, 11, 0 }, + { "<", 2, opid1('<'), ASSOC_LEFT, 10, 0 }, { ">", 2, opid1('>'), ASSOC_LEFT, 10, 0 }, { "<=", 2, opid2('<','='), ASSOC_LEFT, 10, 0 }, @@ -230,6 +260,8 @@ static const oper_info fte_operators[] = { { "==", 2, opid2('=','='), ASSOC_LEFT, 10, 0 }, { "!=", 2, opid2('!','='), ASSOC_LEFT, 10, 0 }, + { "?", 3, opid2('?',':'), ASSOC_RIGHT, 9, 0 }, + { "=", 2, opid1('='), ASSOC_RIGHT, 8, 0 }, { "+=", 2, opid2('+','='), ASSOC_RIGHT, 8, 0 }, { "-=", 2, opid2('-','='), ASSOC_RIGHT, 8, 0 }, @@ -238,14 +270,14 @@ static const oper_info fte_operators[] = { { "%=", 2, opid2('%','='), ASSOC_RIGHT, 8, 0 }, { "&=", 2, opid2('&','='), ASSOC_RIGHT, 8, 0 }, { "|=", 2, opid2('|','='), ASSOC_RIGHT, 8, 0 }, + { "&~=", 2, opid3('&','~','='), ASSOC_RIGHT, 8, 0 }, { "&&", 2, opid2('&','&'), ASSOC_LEFT, 5, 0 }, { "||", 2, opid2('|','|'), ASSOC_LEFT, 5, 0 }, + /* Leave precedence 3 for : with -fcorrect-ternary */ { ",", 2, opid1(','), ASSOC_LEFT, 2, 0 }, - - { "?", 3, opid2('?',':'), ASSOC_RIGHT, 1, 0 }, - { ":", 3, opid2(':','?'), ASSOC_RIGHT, 1, 0 } + { ":", 0, opid2(':','?'), ASSOC_RIGHT, 1, 0 } }; static const size_t fte_operator_count = (sizeof(fte_operators) / sizeof(fte_operators[0])); @@ -288,9 +320,6 @@ static const oper_info qcc_operators[] = { { "||", 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 qcc_operator_count = (sizeof(qcc_operators) / sizeof(qcc_operators[0]));