[#5955] Put unary sign operators at right precedence level
This commit is contained in:
parent
17293ce8e5
commit
56f66b3b3e
@ -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':
|
||||
|
||||
Loading…
Reference in New Issue
Block a user