FLOATEXP.C
上传用户:hlzzc88
上传日期:2007-01-06
资源大小:220k
文件大小:4k
源码类别:

编译器/解释器

开发平台:

Others

  1. /*
  2.  * 68K/386 32-bit C compiler.
  3.  *
  4.  * copyright (c) 1997, David Lindauer
  5.  * 
  6.  * This compiler is intended for educational use.  It may not be used
  7.  * for profit without the express written consent of the author.
  8.  *
  9.  * It may be freely redistributed, as long as this notice remains intact
  10.  * and either the original sources or derived sources 
  11.  * are distributed along with any executables derived from the originals.
  12.  *
  13.  * The author is not responsible for any damages that may arise from use
  14.  * of this software, either idirect or consequential.
  15.  *
  16.  * v1.35 March 1997
  17.  * David Lindauer, gclind01@starbase.spd.louisville.edu
  18.  *
  19.  * Credits to Mathew Brandt for original K&R C compiler
  20.  *
  21.  */
  22. /*
  23.  * this evaluates an expression that may have floating point values in it
  24.  * e.g. the initializer for a module-scoped float or double
  25.  */
  26. #include        <stdio.h>
  27. #include        "expr.h"
  28. #include        "c.h"
  29. #include "errors.h"
  30. extern long ival;
  31. extern long double rval;
  32. extern enum e_sym lastst;
  33. extern char lastid[];
  34. extern TABLE defsyms;
  35. extern int prm_cmangle;
  36. long double floatexpr(void);
  37. /* Primary for constant floats
  38.  *   id
  39.  *   iconst
  40.  *   rconst
  41.  *   defined(MACRO)
  42.  *   (cast) floatexpr
  43.  */
  44. static long double feprimary(void)   
  45. {       long double     temp=0;
  46.         SYM     *sp;
  47.         if(lastst == id) {
  48. char *lid = lastid;
  49. if (prm_cmangle)
  50. lid++;
  51.                 sp = gsearch(lastid);
  52.                 if(sp == NULL) {
  53. gensymerror(ERR_UNDEFINED,lastid);
  54.                        getsym();
  55.                        return 0;
  56.                        }
  57.                 if(sp->storage_class != sc_const && sp->tp->type != bt_enum) {
  58.                        generror(ERR_NEEDCONST,0,0);
  59.                        getsym();
  60.                        return 0;
  61.                        }
  62.                 getsym();
  63.                 return sp->value.i;
  64.         }
  65.         else if(lastst == iconst) {
  66.                 temp = ival;
  67.                 getsym();
  68.                 return temp;
  69.                 }
  70.         else if(lastst == lconst) {
  71.                 temp = ival;
  72.                 getsym();
  73.                 return temp;
  74.                 }
  75.         else if(lastst == iuconst) {
  76.                 temp = (unsigned)ival;
  77.                 getsym();
  78.                 return temp;
  79.                 }
  80.         else if(lastst == luconst) {
  81.                 temp = (unsigned)ival;
  82.                 getsym();
  83.                 return temp;
  84.                 }
  85. else if (lastst = rconst || lastst == lrconst || lastst == fconst) {
  86. temp = rval;
  87. getsym();
  88. return temp;
  89. }
  90. else if (lastst == openpa) {
  91. getsym();
  92. if (castbegin(lastst)) {
  93. decl(0);
  94. decl1();
  95. needpunc(closepa,0);
  96. return floatexpr();
  97. }
  98. else {
  99.    temp = floatexpr();
  100. needpunc(closepa,0);
  101. return(temp);
  102. }
  103. }
  104.         getsym();
  105.         generror(ERR_NEEDCONST,0,0);
  106.         return 0;
  107. }
  108. /* Unary for floating const
  109.  *    -unary
  110.  *    !unary
  111.  *    primary
  112.  */
  113. static long double feunary(void)
  114. {
  115. long double temp;
  116. switch (lastst) {
  117. case minus:
  118. getsym();
  119. temp = -feunary();
  120. break;
  121. case  en_not:
  122. getsym();
  123. temp = !feunary();
  124. break;
  125. default:
  126. temp = feprimary();
  127. break;
  128. }
  129. return(temp);
  130. }
  131. /* Multiply ops */
  132. static long double femultops(void)
  133. {
  134. long double val1 = feunary(),val2;
  135. while (lastst == star || lastst == divide) {
  136. int oper = lastst;
  137. getsym();
  138. val2 = feunary();
  139. switch(oper) {
  140. case star:
  141. val1 = val1 * val2;
  142. break;
  143. case divide:
  144. val1 = val1 / val2;
  145. break;
  146. }
  147. }
  148. return(val1);
  149. }
  150. /* Add ops */
  151. static long double feaddops(void)
  152. {
  153. long double val1 = femultops(),val2;
  154. while (lastst == plus || lastst == minus) {
  155. int oper = lastst;
  156. getsym();
  157. val2 = femultops();
  158. if (oper == plus) 
  159. val1 = val1 + val2;
  160. else
  161. val1 = val1 - val2;
  162. }
  163. return(val1);
  164. }
  165. /* Floating point constant expression */
  166. long double floatexpr(void)
  167. {
  168. return(feaddops());
  169. }