00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "proj.h"
00034 #include "implic.h"
00035 #include "info.h"
00036 #include "src.h"
00037 #include "symbol.h"
00038 #include "target.h"
00039
00040
00041
00042
00043
00044
00045 typedef enum
00046 {
00047 FFEIMPLIC_stateINITIAL_,
00048 FFEIMPLIC_stateASSUMED_,
00049 FFEIMPLIC_stateESTABLISHED_,
00050 FFEIMPLIC_state
00051 } ffeimplicState_;
00052
00053
00054
00055 typedef struct _ffeimplic_ *ffeimplic_;
00056
00057
00058
00059
00060
00061
00062 struct _ffeimplic_
00063 {
00064 ffeimplicState_ state;
00065 ffeinfo info;
00066 };
00067
00068
00069
00070
00071
00072 static struct _ffeimplic_ ffeimplic_table_['z' - 'A' + 1];
00073
00074
00075
00076 static ffeimplic_ ffeimplic_lookup_ (unsigned char c);
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 static ffeimplic_
00092 ffeimplic_lookup_ (unsigned char c)
00093 {
00094
00095 if (ISIDST (c))
00096 return &ffeimplic_table_[c - 'A'];
00097 return NULL;
00098 }
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 bool
00110 ffeimplic_establish_initial (char c, ffeinfoBasictype basic_type,
00111 ffeinfoKindtype kind_type, ffetargetCharacterSize size)
00112 {
00113 ffeimplic_ imp;
00114
00115 imp = ffeimplic_lookup_ (c);
00116 if (imp == NULL)
00117 return FALSE;
00118 if (ffeinfo_basictype (imp->info) == FFEINFO_basictypeNONE)
00119 return FALSE;
00120
00121 switch (imp->state)
00122 {
00123 case FFEIMPLIC_stateINITIAL_:
00124 imp->info = ffeinfo_new (basic_type,
00125 kind_type,
00126 0,
00127 FFEINFO_kindNONE,
00128 FFEINFO_whereNONE,
00129 size);
00130 imp->state = FFEIMPLIC_stateESTABLISHED_;
00131 return TRUE;
00132
00133 case FFEIMPLIC_stateASSUMED_:
00134 if ((ffeinfo_basictype (imp->info) != basic_type)
00135 || (ffeinfo_kindtype (imp->info) != kind_type)
00136 || (ffeinfo_size (imp->info) != size))
00137 return FALSE;
00138 imp->state = FFEIMPLIC_stateESTABLISHED_;
00139 return TRUE;
00140
00141 case FFEIMPLIC_stateESTABLISHED_:
00142 return FALSE;
00143
00144 default:
00145 assert ("Weird state for implicit object" == NULL);
00146 return FALSE;
00147 }
00148 }
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 bool
00169 ffeimplic_establish_symbol (ffesymbol s)
00170 {
00171 char c;
00172 ffeimplic_ imp;
00173
00174 if (ffesymbol_basictype (s) != FFEINFO_basictypeNONE)
00175 return TRUE;
00176
00177 c = *(ffesymbol_text (s));
00178 imp = ffeimplic_lookup_ (c);
00179 if (imp == NULL)
00180 return FALSE;
00181
00182 if (ffeinfo_basictype (imp->info) == FFEINFO_basictypeNONE)
00183 return FALSE;
00184
00185 ffesymbol_signal_change (s);
00186
00187
00188
00189 ffesymbol_set_info (s,
00190 ffeinfo_new (ffeinfo_basictype (imp->info),
00191 ffeinfo_kindtype (imp->info),
00192 ffesymbol_rank (s),
00193 ffesymbol_kind (s),
00194 ffesymbol_where (s),
00195 ffeinfo_size (imp->info)));
00196
00197 if (imp->state == FFEIMPLIC_stateINITIAL_)
00198 imp->state = FFEIMPLIC_stateASSUMED_;
00199
00200 if (ffe_is_warn_implicit ())
00201 {
00202
00203 ffebad_start_msg ("Implicit declaration of `%A' at %0",
00204 FFEBAD_severityWARNING);
00205 ffebad_here (0, ffesymbol_where_line (s),
00206 ffesymbol_where_column (s));
00207 ffebad_string (ffesymbol_text (s));
00208 ffebad_finish ();
00209 }
00210
00211 return TRUE;
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222 void
00223 ffeimplic_init_2 ()
00224 {
00225 ffeimplic_ imp;
00226 char c;
00227
00228 for (c = 'A'; c <= 'z'; ++c)
00229 {
00230 imp = &ffeimplic_table_[c - 'A'];
00231 imp->state = FFEIMPLIC_stateINITIAL_;
00232 switch (c)
00233 {
00234 case 'A':
00235 case 'B':
00236 case 'C':
00237 case 'D':
00238 case 'E':
00239 case 'F':
00240 case 'G':
00241 case 'H':
00242 case 'O':
00243 case 'P':
00244 case 'Q':
00245 case 'R':
00246 case 'S':
00247 case 'T':
00248 case 'U':
00249 case 'V':
00250 case 'W':
00251 case 'X':
00252 case 'Y':
00253 case 'Z':
00254 case '_':
00255 case 'a':
00256 case 'b':
00257 case 'c':
00258 case 'd':
00259 case 'e':
00260 case 'f':
00261 case 'g':
00262 case 'h':
00263 case 'o':
00264 case 'p':
00265 case 'q':
00266 case 'r':
00267 case 's':
00268 case 't':
00269 case 'u':
00270 case 'v':
00271 case 'w':
00272 case 'x':
00273 case 'y':
00274 case 'z':
00275 imp->info = ffeinfo_new (FFEINFO_basictypeREAL,
00276 FFEINFO_kindtypeREALDEFAULT,
00277 0,
00278 FFEINFO_kindNONE,
00279 FFEINFO_whereNONE,
00280 FFETARGET_charactersizeNONE);
00281 break;
00282
00283 case 'I':
00284 case 'J':
00285 case 'K':
00286 case 'L':
00287 case 'M':
00288 case 'N':
00289 case 'i':
00290 case 'j':
00291 case 'k':
00292 case 'l':
00293 case 'm':
00294 case 'n':
00295 imp->info = ffeinfo_new (FFEINFO_basictypeINTEGER,
00296 FFEINFO_kindtypeINTEGERDEFAULT, 0, FFEINFO_kindNONE, FFEINFO_whereNONE,
00297 FFETARGET_charactersizeNONE);
00298 break;
00299
00300 default:
00301 imp->info = ffeinfo_new (FFEINFO_basictypeNONE, FFEINFO_kindtypeNONE, 0,
00302 FFEINFO_kindNONE, FFEINFO_whereNONE, FFETARGET_charactersizeNONE);
00303 break;
00304 }
00305 }
00306 }
00307
00308
00309
00310
00311
00312
00313
00314 void
00315 ffeimplic_none ()
00316 {
00317 ffeimplic_ imp;
00318
00319 for (imp = &ffeimplic_table_[0];
00320 imp != &ffeimplic_table_[ARRAY_SIZE (ffeimplic_table_)];
00321 imp++)
00322 {
00323 imp->info = ffeinfo_new (FFEINFO_basictypeNONE,
00324 FFEINFO_kindtypeNONE,
00325 0,
00326 FFEINFO_kindNONE,
00327 FFEINFO_whereNONE,
00328 FFETARGET_charactersizeNONE);
00329 }
00330 }
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 ffeinfoBasictype
00352 ffeimplic_peek_symbol_type (ffesymbol s, const char *name)
00353 {
00354 char c;
00355 ffeimplic_ imp;
00356
00357 if (s == NULL)
00358 c = *name;
00359 else
00360 {
00361 if (ffesymbol_basictype (s) != FFEINFO_basictypeNONE)
00362 return ffesymbol_basictype (s);
00363
00364 c = *(ffesymbol_text (s));
00365 }
00366
00367 imp = ffeimplic_lookup_ (c);
00368 if (imp == NULL)
00369 return FFEINFO_basictypeNONE;
00370
00371 return ffeinfo_basictype (imp->info);
00372 }
00373
00374
00375
00376
00377
00378
00379
00380 void
00381 ffeimplic_terminate_2 ()
00382 {
00383 }