* expr.c (operand): Don't use [ for parens if we want an index op.

(op_encoding): Switch [ into O_index, if desired.
        (op_rank): Renumber with O_index on bottom.
        (expr): If O_index, match closing bracket.
        * expr.h (O_index): New.
This commit is contained in:
Richard Henderson 1999-06-03 02:51:27 +00:00
parent 1c32af2255
commit b585bc2c0a
2 changed files with 45 additions and 23 deletions

View file

@ -989,7 +989,9 @@ operand (expressionP)
break;
case '(':
#ifndef NEED_INDEX_OPERATOR
case '[':
#endif
/* didn't begin with digit & not a name */
segment = expression (expressionP);
/* Expression() will pass trailing whitespace */
@ -1415,7 +1417,13 @@ static const operatorT op_encoding[256] =
__, __, __, __, __, __, __, __,
__, __, __, __, __, __, __, __,
__, __, __, __, __, __, __, __,
__, __, __, __, __, __, O_bit_exclusive_or, __,
__, __, __,
#ifdef NEED_INDEX_OPERATOR
O_index,
#else
__,
#endif
__, __, O_bit_exclusive_or, __,
__, __, __, __, __, __, __, __,
__, __, __, __, __, __, __, __,
__, __, __, __, __, __, __, __,
@ -1453,28 +1461,29 @@ static operator_rankT op_rank[] =
0, /* O_symbol_rva */
0, /* O_register */
0, /* O_bit */
8, /* O_uminus */
8, /* O_bit_not */
8, /* O_logical_not */
7, /* O_multiply */
7, /* O_divide */
7, /* O_modulus */
7, /* O_left_shift */
7, /* O_right_shift */
6, /* O_bit_inclusive_or */
6, /* O_bit_or_not */
6, /* O_bit_exclusive_or */
6, /* O_bit_and */
4, /* O_add */
4, /* O_subtract */
3, /* O_eq */
3, /* O_ne */
3, /* O_lt */
3, /* O_le */
3, /* O_ge */
3, /* O_gt */
2, /* O_logical_and */
1 /* O_logical_or */
9, /* O_uminus */
9, /* O_bit_not */
9, /* O_logical_not */
8, /* O_multiply */
8, /* O_divide */
8, /* O_modulus */
8, /* O_left_shift */
8, /* O_right_shift */
7, /* O_bit_inclusive_or */
7, /* O_bit_or_not */
7, /* O_bit_exclusive_or */
7, /* O_bit_and */
5, /* O_add */
5, /* O_subtract */
4, /* O_eq */
4, /* O_ne */
4, /* O_lt */
4, /* O_le */
4, /* O_ge */
4, /* O_gt */
3, /* O_logical_and */
2, /* O_logical_or */
1, /* O_index */
};
/* Unfortunately, in MRI mode for the m68k, multiplication and
@ -1641,6 +1650,17 @@ expr (rank, resultP)
know (*input_line_pointer != ' ');
if (op_left == O_index)
{
if (*input_line_pointer != ']')
as_bad ("missing right bracket");
else
{
++input_line_pointer;
SKIP_WHITESPACE ();
}
}
if (retval == undefined_section)
{
if (SEG_NORMAL (rightseg))

View file

@ -102,6 +102,8 @@ typedef enum
O_logical_and,
/* (X_add_symbol || X_op_symbol) + X_add_number. */
O_logical_or,
/* X_op_symbol [ X_add_symbol ] */
O_index,
/* this must be the largest value */
O_max
} operatorT;