[#5955] Put unary sign operators at right precedence level

This commit is contained in:
lukaseder 2017-04-17 22:45:26 +02:00
parent 17293ce8e5
commit 56f66b3b3e

View File

@ -2352,18 +2352,40 @@ class ParserImpl implements Parser {
}
private static final FieldOrRow parseExp(ParserContext ctx, Type type) {
FieldOrRow r = parseTerm(ctx, type);
FieldOrRow r = parseSigned(ctx, type);
if (N.is(type) && r instanceof Field)
for (;;)
if (parseIf(ctx, '^'))
r = ((Field) r).pow(toField(ctx, parseTerm(ctx, type)));
r = ((Field) r).pow(toField(ctx, parseSigned(ctx, type)));
else
break;
return r;
}
private static final FieldOrRow parseSigned(ParserContext ctx, Type type) {
Integer sign = null;
FieldOrRow r;
for (;;)
if (parseIf(ctx, '+'))
sign = 1;
else if (parseIf(ctx, '-'))
sign = sign == null ? -1 : -sign;
else
break;
if (sign == null)
r = parseTerm(ctx, type);
else if (sign == 1)
r = toField(ctx, parseTerm(ctx, type));
else if ((r = parseFieldUnsignedNumericLiteralIf(ctx, true)) == null)
r = toField(ctx, parseTerm(ctx, type)).neg();
return r;
}
private static final FieldOrRow parseTerm(ParserContext ctx, Type type) {
parseWhitespaceIf(ctx);
@ -2717,25 +2739,6 @@ class ParserImpl implements Parser {
break;
case '+':
parse(ctx, '+');
if (N.is(type))
return parseTerm(ctx, type);
else
break;
case '-':
parse(ctx, '-');
if (N.is(type))
if ((field = parseFieldUnsignedNumericLiteralIf(ctx, true)) != null)
return field;
else
return toField(ctx, parseTerm(ctx, type)).neg();
break;
case '0':
case '1':
case '2':