mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-03-21 18:30:52 +00:00
Adding ids to operators for SYA later
This commit is contained in:
parent
69ba2dd9f8
commit
9314157be5
2 changed files with 62 additions and 42 deletions
81
lexer.h
81
lexer.h
|
@ -117,66 +117,67 @@ enum {
|
|||
|
||||
typedef struct {
|
||||
const char *op;
|
||||
unsigned int id;
|
||||
unsigned int assoc;
|
||||
unsigned int prec;
|
||||
unsigned int flags;
|
||||
} oper_info;
|
||||
|
||||
static const oper_info operators[] = {
|
||||
{ "++", ASSOC_LEFT, 16, OP_SUFFIX},
|
||||
{ "--", ASSOC_LEFT, 16, OP_SUFFIX},
|
||||
{ "++", 1, ASSOC_LEFT, 16, OP_SUFFIX},
|
||||
{ "--", 2, ASSOC_LEFT, 16, OP_SUFFIX},
|
||||
|
||||
{ ".", ASSOC_LEFT, 15, 0 },
|
||||
{ ".", 10, ASSOC_LEFT, 15, 0 },
|
||||
|
||||
{ "!", ASSOC_RIGHT, 14, 0 },
|
||||
{ "~", ASSOC_RIGHT, 14, 0 },
|
||||
{ "+", ASSOC_RIGHT, 14, OP_PREFIX },
|
||||
{ "-", ASSOC_RIGHT, 14, OP_PREFIX },
|
||||
{ "++", ASSOC_RIGHT, 14, OP_PREFIX },
|
||||
{ "--", ASSOC_RIGHT, 14, OP_PREFIX },
|
||||
/* { "&", ASSOC_RIGHT, 14, OP_PREFIX }, */
|
||||
{ "!", 21, ASSOC_RIGHT, 14, 0 },
|
||||
{ "~", 22, ASSOC_RIGHT, 14, 0 },
|
||||
{ "+", 23, ASSOC_RIGHT, 14, OP_PREFIX },
|
||||
{ "-", 24, ASSOC_RIGHT, 14, OP_PREFIX },
|
||||
{ "++", 25, ASSOC_RIGHT, 14, OP_PREFIX },
|
||||
{ "--", 26, ASSOC_RIGHT, 14, OP_PREFIX },
|
||||
/* { "&", 27, ASSOC_RIGHT, 14, OP_PREFIX }, */
|
||||
|
||||
{ "*", ASSOC_LEFT, 13, 0 },
|
||||
{ "/", ASSOC_LEFT, 13, 0 },
|
||||
{ "%", ASSOC_LEFT, 13, 0 },
|
||||
{ "*", 30, ASSOC_LEFT, 13, 0 },
|
||||
{ "/", 31, ASSOC_LEFT, 13, 0 },
|
||||
{ "%", 32, ASSOC_LEFT, 13, 0 },
|
||||
|
||||
{ "+", ASSOC_LEFT, 12, 0 },
|
||||
{ "-", ASSOC_LEFT, 12, 0 },
|
||||
{ "+", 40, ASSOC_LEFT, 12, 0 },
|
||||
{ "-", 41, ASSOC_LEFT, 12, 0 },
|
||||
|
||||
{ "<<", ASSOC_LEFT, 11, 0 },
|
||||
{ ">>", ASSOC_LEFT, 11, 0 },
|
||||
{ "<<", 50, ASSOC_LEFT, 11, 0 },
|
||||
{ ">>", 51, ASSOC_LEFT, 11, 0 },
|
||||
|
||||
{ "<", ASSOC_LEFT, 10, 0 },
|
||||
{ ">", ASSOC_LEFT, 10, 0 },
|
||||
{ "<=", ASSOC_LEFT, 10, 0 },
|
||||
{ ">=", ASSOC_LEFT, 10, 0 },
|
||||
{ "<", 60, ASSOC_LEFT, 10, 0 },
|
||||
{ ">", 61, ASSOC_LEFT, 10, 0 },
|
||||
{ "<=", 62, ASSOC_LEFT, 10, 0 },
|
||||
{ ">=", 63, ASSOC_LEFT, 10, 0 },
|
||||
|
||||
{ "==", ASSOC_LEFT, 9, 0 },
|
||||
{ "!=", ASSOC_LEFT, 9, 0 },
|
||||
{ "==", 70, ASSOC_LEFT, 9, 0 },
|
||||
{ "!=", 71, ASSOC_LEFT, 9, 0 },
|
||||
|
||||
{ "&", ASSOC_LEFT, 8, 0 },
|
||||
{ "&", 80, ASSOC_LEFT, 8, 0 },
|
||||
|
||||
{ "^", ASSOC_LEFT, 7, 0 },
|
||||
{ "^", 90, ASSOC_LEFT, 7, 0 },
|
||||
|
||||
{ "|", ASSOC_LEFT, 6, 0 },
|
||||
{ "|", 100, ASSOC_LEFT, 6, 0 },
|
||||
|
||||
{ "&&", ASSOC_LEFT, 5, 0 },
|
||||
{ "&&", 110, ASSOC_LEFT, 5, 0 },
|
||||
|
||||
{ "||", ASSOC_LEFT, 4, 0 },
|
||||
{ "||", 120, ASSOC_LEFT, 4, 0 },
|
||||
|
||||
{ "?", ASSOC_RIGHT, 3, 0 },
|
||||
{ "?", 130, ASSOC_RIGHT, 3, 0 },
|
||||
|
||||
{ "=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "+=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "-=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "*=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "/=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "%=", ASSOC_RIGHT, 2, 0 },
|
||||
{ ">>=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "<<=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "&=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "^=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "|=", ASSOC_RIGHT, 2, 0 },
|
||||
{ "=", 140, ASSOC_RIGHT, 2, 0 },
|
||||
{ "+=", 141, ASSOC_RIGHT, 2, 0 },
|
||||
{ "-=", 142, ASSOC_RIGHT, 2, 0 },
|
||||
{ "*=", 143, ASSOC_RIGHT, 2, 0 },
|
||||
{ "/=", 144, ASSOC_RIGHT, 2, 0 },
|
||||
{ "%=", 145, ASSOC_RIGHT, 2, 0 },
|
||||
{ ">>=", 146, ASSOC_RIGHT, 2, 0 },
|
||||
{ "<<=", 147, ASSOC_RIGHT, 2, 0 },
|
||||
{ "&=", 148, ASSOC_RIGHT, 2, 0 },
|
||||
{ "^=", 149, ASSOC_RIGHT, 2, 0 },
|
||||
{ "|=", 150, ASSOC_RIGHT, 2, 0 },
|
||||
};
|
||||
|
||||
typedef struct
|
||||
|
|
23
parser.c
23
parser.c
|
@ -159,9 +159,26 @@ static ast_value *parser_parse_type(parser_t *parser, int basetype, bool *isfunc
|
|||
return var;
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int etype; /* 0 = expression, others are operators */
|
||||
ast_expression* out;
|
||||
} sy_elem;
|
||||
typedef struct
|
||||
{
|
||||
MEM_VECTOR_MAKE(sy_elem, out);
|
||||
MEM_VECTOR_MAKE(sy_elem, ops);
|
||||
} shyntingyard;
|
||||
|
||||
static bool parser_expression(parser_t *parser, ast_block *block)
|
||||
{
|
||||
parseerror(parser, "TODO: statements/expressions");
|
||||
shyntingyard sy;
|
||||
|
||||
MEM_VECTOR_INIT(&sy, out);
|
||||
MEM_VECTOR_INIT(&sy, ops);
|
||||
|
||||
MEM_VECTOR_CLEAR(&sy, out);
|
||||
MEM_VECTOR_CLEAR(&sy, ops);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -178,9 +195,11 @@ static bool parser_body_do(parser_t *parser, ast_block *block)
|
|||
else if (parser->tok == '{')
|
||||
{
|
||||
/* a block */
|
||||
parseerror(parser, "TODO: inner blocks");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
return parser_expression(parser_t *parser, ast_block *block);
|
||||
return parser_expression(parser, block);
|
||||
}
|
||||
|
||||
static ast_block* parser_parse_block(parser_t *parser)
|
||||
|
|
Loading…
Reference in a new issue