home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / cctools / as / expr.h < prev    next >
Text File  |  1993-09-09  |  4KB  |  111 lines

  1. /* expr.h -> header file for expr.c
  2.    Copyright (C) 1987 Free Software Foundation, Inc.
  3.  
  4. This file is part of GAS, the GNU Assembler.
  5.  
  6. GAS is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 1, or (at your option)
  9. any later version.
  10.  
  11. GAS is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15.  
  16. You should have received a copy of the GNU General Public License
  17. along with GAS; see the file COPYING.  If not, write to
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #import "struc-symbol.h"
  21. #import "bignum.h"
  22. #import "flonum.h"
  23.  
  24. /*
  25.  * This table describes the use of segments as EXPRESSION types.
  26.  *
  27.  *    X_seg    X_add_symbol  X_subtract_symbol    X_add_number
  28.  * SEG_NONE                        no (legal) expression
  29.  * SEG_BIG                    *    > 32 bits const.
  30.  * SEG_ABSOLUTE                         0
  31.  * SEG_SECT        *                 0
  32.  * SEG_UNKNOWN        *            0
  33.  * SEG_DIFFSECT        0        *    0
  34.  *
  35.  * The blank fields MUST be 0, and are nugatory.
  36.  * The '0' fields MAY be 0. The '*' fields MAY NOT be 0.
  37.  *
  38.  * SEG_BIG: A floating point number or an integer larger than 32 bits.
  39.  *   For a floating point number:
  40.  *    X_add_number is < 0
  41.  *         The result is in the global variable generic_floating_point_number.
  42.  *        The value in X_add_number is -'c' where c is the character that
  43.  *        introduced the constant.  e.g. "0f6.9" will have  -'f' as a
  44.  *        X_add_number value.
  45.  *   For an integer larger than 32 bits:
  46.  *    X_add_number > 0
  47.  *        The result is in the global variable generic_bignum.
  48.  *        The value in X_add_number is a count of how many littlenums it
  49.  *        took to represent the bignum.
  50.  */
  51. typedef enum {
  52.     SEG_ABSOLUTE,    /* absolute */
  53.     SEG_SECT,        /* normal defined section */
  54.     SEG_DIFFSECT,    /* difference between symbols in sections */
  55.     SEG_UNKNOWN,    /* expression involving an undefined symbol */
  56.     SEG_NONE,        /* no expression */
  57.     SEG_BIG        /* bigger than 32 bits constant */
  58. } segT;
  59.  
  60. extern char *seg_name[];
  61. extern segT N_TYPE_seg[];
  62.  
  63. /*
  64.  * When an expression is SEG_BIG, it is in these globals (see comments above
  65.  * about SEG_BIG).  This data may be clobbered whenever expr() is called.
  66.  */
  67. extern FLONUM_TYPE    generic_floating_point_number;
  68. extern LITTLENUM_TYPE generic_bignum[];
  69. #define SIZE_OF_LARGE_NUMBER (20)    /* Number of littlenums in above */
  70.                     /* generic_bignum which is enough to */
  71.                     /* hold most precise flonum. */
  72.  
  73. /*
  74.  * Abbreviations (mnemonics).
  75.  *
  76.  *    O    operator
  77.  *    Q    quantity,  operand
  78.  *    X    eXpression
  79.  */
  80.  
  81. /*
  82.  * By popular demand, we define a struct to represent an expression.
  83.  * This will no doubt mutate as expressions become baroque.
  84.  *
  85.  * Currently, we support expressions like "foo-bar+42".
  86.  * In other words we permit a (possibly undefined) minuend, a
  87.  * (possibly undefined) subtrahend and an (absolute) augend.
  88.  * RMS says this is so we can have 1-pass assembly for any compiler
  89.  * emmissions, and a 'case' statement might emit 'undefined1 - undefined2'.
  90.  *
  91.  * To simplify table-driven dispatch, we also have a "segment" for the
  92.  * entire expression. That way we don't require complex reasoning about
  93.  * whether particular components are defined; and we can change component
  94.  * semantics without re-working all the dispatch tables in the assembler.
  95.  * In other words the "type" of an expression is its segment.
  96.  */
  97.  
  98. typedef struct {
  99.     symbolS *X_add_symbol;    /* foo */
  100.     symbolS *X_subtract_symbol;    /* bar */
  101.     long     X_add_number;    /* 42 (must be signed) */
  102.     segT     X_seg;        /* What segment (expr type) */
  103. } expressionS;
  104.  
  105. extern segT expression(
  106.     expressionS *resultP);
  107. extern char get_symbol_end(
  108.     void);
  109. extern segT try_to_make_absolute(
  110.     expressionS *expressionP);
  111.