mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-30 15:41:12 +00:00
nicer error messages, bitand and bitor for floats allowed
This commit is contained in:
parent
9f151e82df
commit
5390b2d7c2
1 changed files with 20 additions and 6 deletions
26
parser.c
26
parser.c
|
@ -424,7 +424,7 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
|
||||||
out = (ast_expression*)ast_binary_new(ctx, INSTR_ADD_V, exprs[0], exprs[1]);
|
out = (ast_expression*)ast_binary_new(ctx, INSTR_ADD_V, exprs[0], exprs[1]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
parseerror(parser, "Cannot add type %s and %s",
|
parseerror(parser, "type error: cannot add type %s to %s",
|
||||||
type_name[exprs[0]->expression.vtype],
|
type_name[exprs[0]->expression.vtype],
|
||||||
type_name[exprs[1]->expression.vtype]);
|
type_name[exprs[1]->expression.vtype]);
|
||||||
return false;
|
return false;
|
||||||
|
@ -432,7 +432,7 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
|
||||||
break;
|
break;
|
||||||
case opid1('-'):
|
case opid1('-'):
|
||||||
if (exprs[0]->expression.vtype != exprs[1]->expression.vtype) {
|
if (exprs[0]->expression.vtype != exprs[1]->expression.vtype) {
|
||||||
parseerror(parser, "Cannot subtract type %s from %s",
|
parseerror(parser, "type error: cannot subtract type %s from %s",
|
||||||
type_name[exprs[1]->expression.vtype],
|
type_name[exprs[1]->expression.vtype],
|
||||||
type_name[exprs[0]->expression.vtype]);
|
type_name[exprs[0]->expression.vtype]);
|
||||||
return false;
|
return false;
|
||||||
|
@ -451,7 +451,7 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
|
||||||
out = (ast_expression*)ast_binary_new(ctx, INSTR_SUB_V, exprs[0], exprs[1]);
|
out = (ast_expression*)ast_binary_new(ctx, INSTR_SUB_V, exprs[0], exprs[1]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
parseerror(parser, "Cannot add type %s from %s",
|
parseerror(parser, "type error: cannot subtract type %s from %s",
|
||||||
type_name[exprs[1]->expression.vtype],
|
type_name[exprs[1]->expression.vtype],
|
||||||
type_name[exprs[0]->expression.vtype]);
|
type_name[exprs[0]->expression.vtype]);
|
||||||
return false;
|
return false;
|
||||||
|
@ -464,7 +464,7 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
|
||||||
exprs[1]->expression.vtype != TYPE_VECTOR &&
|
exprs[1]->expression.vtype != TYPE_VECTOR &&
|
||||||
exprs[1]->expression.vtype != TYPE_FLOAT)
|
exprs[1]->expression.vtype != TYPE_FLOAT)
|
||||||
{
|
{
|
||||||
parseerror(parser, "Cannot multiply type %s from %s",
|
parseerror(parser, "type error: cannot multiply type %s by %s",
|
||||||
type_name[exprs[1]->expression.vtype],
|
type_name[exprs[1]->expression.vtype],
|
||||||
type_name[exprs[0]->expression.vtype]);
|
type_name[exprs[0]->expression.vtype]);
|
||||||
return false;
|
return false;
|
||||||
|
@ -483,7 +483,7 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
|
||||||
out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_V, exprs[0], exprs[1]);
|
out = (ast_expression*)ast_binary_new(ctx, INSTR_MUL_V, exprs[0], exprs[1]);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
parseerror(parser, "Cannot add type %s from %s",
|
parseerror(parser, "type error: cannot multiplye type %s by %s",
|
||||||
type_name[exprs[1]->expression.vtype],
|
type_name[exprs[1]->expression.vtype],
|
||||||
type_name[exprs[0]->expression.vtype]);
|
type_name[exprs[0]->expression.vtype]);
|
||||||
return false;
|
return false;
|
||||||
|
@ -493,13 +493,27 @@ static bool parser_sy_pop(parser_t *parser, shunt *sy)
|
||||||
if (exprs[0]->expression.vtype != exprs[1]->expression.vtype ||
|
if (exprs[0]->expression.vtype != exprs[1]->expression.vtype ||
|
||||||
exprs[0]->expression.vtype != TYPE_FLOAT)
|
exprs[0]->expression.vtype != TYPE_FLOAT)
|
||||||
{
|
{
|
||||||
parseerror(parser, "Cannot divide types %s and %s",
|
parseerror(parser, "type error: cannot divide types %s and %s",
|
||||||
type_name[exprs[0]->expression.vtype],
|
type_name[exprs[0]->expression.vtype],
|
||||||
type_name[exprs[1]->expression.vtype]);
|
type_name[exprs[1]->expression.vtype]);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
out = (ast_expression*)ast_binary_new(ctx, INSTR_DIV_F, exprs[0], exprs[1]);
|
out = (ast_expression*)ast_binary_new(ctx, INSTR_DIV_F, exprs[0], exprs[1]);
|
||||||
break;
|
break;
|
||||||
|
case opid1('|'):
|
||||||
|
case opid1('&'):
|
||||||
|
if (exprs[0]->expression.vtype != exprs[1]->expression.vtype ||
|
||||||
|
exprs[0]->expression.vtype != TYPE_FLOAT)
|
||||||
|
{
|
||||||
|
parseerror(parser, "type error: cannot perform bit operations on types %s and %s",
|
||||||
|
type_name[exprs[0]->expression.vtype],
|
||||||
|
type_name[exprs[1]->expression.vtype]);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
out = (ast_expression*)ast_binary_new(ctx,
|
||||||
|
(op->id == opid1('|') ? INSTR_BITOR : INSTR_BITAND),
|
||||||
|
exprs[0], exprs[1]);
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
case opid1('='):
|
case opid1('='):
|
||||||
|
|
Loading…
Reference in a new issue