📄 expr.c
字号:
/* expr.c -- Implementation File (module.c template V1.0) Copyright (C) 1995-1998 Free Software Foundation, Inc. Contributed by James Craig Burley.This file is part of GNU Fortran.GNU Fortran is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2, or (at your option)any later version.GNU Fortran is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with GNU Fortran; see the file COPYING. If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA. Related Modules: None. Description: Handles syntactic and semantic analysis of Fortran expressions. Modifications:*//* Include files. */#include "proj.h"#include "expr.h"#include "bad.h"#include "bld.h"#include "com.h"#include "global.h"#include "implic.h"#include "intrin.h"#include "info.h"#include "lex.h"#include "malloc.h"#include "src.h"#include "st.h"#include "symbol.h"#include "str.h"#include "target.h"#include "where.h"/* Externals defined here. *//* Simple definitions and enumerations. */typedef enum { FFEEXPR_exprtypeUNKNOWN_, FFEEXPR_exprtypeOPERAND_, FFEEXPR_exprtypeUNARY_, FFEEXPR_exprtypeBINARY_, FFEEXPR_exprtype_ } ffeexprExprtype_;typedef enum { FFEEXPR_operatorPOWER_, FFEEXPR_operatorMULTIPLY_, FFEEXPR_operatorDIVIDE_, FFEEXPR_operatorADD_, FFEEXPR_operatorSUBTRACT_, FFEEXPR_operatorCONCATENATE_, FFEEXPR_operatorLT_, FFEEXPR_operatorLE_, FFEEXPR_operatorEQ_, FFEEXPR_operatorNE_, FFEEXPR_operatorGT_, FFEEXPR_operatorGE_, FFEEXPR_operatorNOT_, FFEEXPR_operatorAND_, FFEEXPR_operatorOR_, FFEEXPR_operatorXOR_, FFEEXPR_operatorEQV_, FFEEXPR_operatorNEQV_, FFEEXPR_operator_ } ffeexprOperator_;typedef enum { FFEEXPR_operatorprecedenceHIGHEST_ = 1, FFEEXPR_operatorprecedencePOWER_ = 1, FFEEXPR_operatorprecedenceMULTIPLY_ = 2, FFEEXPR_operatorprecedenceDIVIDE_ = 2, FFEEXPR_operatorprecedenceADD_ = 3, FFEEXPR_operatorprecedenceSUBTRACT_ = 3, FFEEXPR_operatorprecedenceLOWARITH_ = 3, FFEEXPR_operatorprecedenceCONCATENATE_ = 3, FFEEXPR_operatorprecedenceLT_ = 4, FFEEXPR_operatorprecedenceLE_ = 4, FFEEXPR_operatorprecedenceEQ_ = 4, FFEEXPR_operatorprecedenceNE_ = 4, FFEEXPR_operatorprecedenceGT_ = 4, FFEEXPR_operatorprecedenceGE_ = 4, FFEEXPR_operatorprecedenceNOT_ = 5, FFEEXPR_operatorprecedenceAND_ = 6, FFEEXPR_operatorprecedenceOR_ = 7, FFEEXPR_operatorprecedenceXOR_ = 8, FFEEXPR_operatorprecedenceEQV_ = 8, FFEEXPR_operatorprecedenceNEQV_ = 8, FFEEXPR_operatorprecedenceLOWEST_ = 8, FFEEXPR_operatorprecedence_ } ffeexprOperatorPrecedence_;#define FFEEXPR_operatorassociativityL2R_ TRUE#define FFEEXPR_operatorassociativityR2L_ FALSE#define FFEEXPR_operatorassociativityPOWER_ FFEEXPR_operatorassociativityR2L_#define FFEEXPR_operatorassociativityMULTIPLY_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityDIVIDE_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityADD_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativitySUBTRACT_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityCONCATENATE_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityLT_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityLE_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityEQ_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityNE_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityGT_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityGE_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityNOT_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityAND_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityOR_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityXOR_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityEQV_ FFEEXPR_operatorassociativityL2R_#define FFEEXPR_operatorassociativityNEQV_ FFEEXPR_operatorassociativityL2R_typedef enum { FFEEXPR_parentypeFUNCTION_, FFEEXPR_parentypeSUBROUTINE_, FFEEXPR_parentypeARRAY_, FFEEXPR_parentypeSUBSTRING_, FFEEXPR_parentypeFUNSUBSTR_,/* Ambig: check for colon after first expr. */ FFEEXPR_parentypeEQUIVALENCE_, /* Ambig: ARRAY_ or SUBSTRING_. */ FFEEXPR_parentypeANY_, /* Allow basically anything. */ FFEEXPR_parentype_ } ffeexprParenType_;typedef enum { FFEEXPR_percentNONE_, FFEEXPR_percentLOC_, FFEEXPR_percentVAL_, FFEEXPR_percentREF_, FFEEXPR_percentDESCR_, FFEEXPR_percent_ } ffeexprPercent_;/* Internal typedefs. */typedef struct _ffeexpr_expr_ *ffeexprExpr_;typedef bool ffeexprOperatorAssociativity_;typedef struct _ffeexpr_stack_ *ffeexprStack_;/* Private include files. *//* Internal structure definitions. */struct _ffeexpr_expr_ { ffeexprExpr_ previous; ffelexToken token; ffeexprExprtype_ type; union { struct { ffeexprOperator_ op; ffeexprOperatorPrecedence_ prec; ffeexprOperatorAssociativity_ as; } operator; ffebld operand; } u; };struct _ffeexpr_stack_ { ffeexprStack_ previous; mallocPool pool; ffeexprContext context; ffeexprCallback callback; ffelexToken first_token; ffeexprExpr_ exprstack; ffelexToken tokens[10]; /* Used in certain cases, like (unary) open-paren. */ ffebld expr; /* For first of complex/implied-do/substring/array-elements / actual-args expression. */ ffebld bound_list; /* For tracking dimension bounds list of array. */ ffebldListBottom bottom; /* For building lists. */ ffeinfoRank rank; /* For elements in an array reference. */ bool constant; /* TRUE while elements seen so far are constants. */ bool immediate; /* TRUE while elements seen so far are immediate/constants. */ ffebld next_dummy; /* Next SFUNC dummy arg in arg list. */ ffebldListLength num_args; /* Number of dummy args expected in arg list. */ bool is_rhs; /* TRUE if rhs context, FALSE otherwise. */ ffeexprPercent_ percent; /* Current %FOO keyword. */ };struct _ffeexpr_find_ { ffelexToken t; ffelexHandler after; int level; };/* Static objects accessed by functions in this module. */static ffeexprStack_ ffeexpr_stack_; /* Expression stack for semantic. */static ffelexToken ffeexpr_tokens_[10]; /* Scratchpad tokens for syntactic. */static ffestrOther ffeexpr_current_dotdot_; /* Current .FOO. keyword. */static long ffeexpr_hollerith_count_; /* ffeexpr_token_number_ and caller. */static int ffeexpr_level_; /* Level of DATA implied-DO construct. */static bool ffeexpr_is_substr_ok_; /* If OPEN_PAREN as binary "op" ok. */static struct _ffeexpr_find_ ffeexpr_find_;/* Static functions (internal). */static ffelexHandler ffeexpr_cb_close_paren_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_close_paren_ambig_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_close_paren_ambig_1_ (ffelexToken t);static ffelexHandler ffeexpr_cb_close_paren_c_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_comma_c_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_close_paren_ci_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_comma_ci_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_comma_i_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_comma_i_1_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_comma_i_2_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_comma_i_3_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_comma_i_4_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_comma_i_5_ (ffelexToken t);static ffelexHandler ffeexpr_cb_end_loc_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_end_notloc_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_cb_end_notloc_1_ (ffelexToken t);static ffesymbol ffeexpr_check_impctrl_ (ffesymbol s);static void ffeexpr_check_impdo_ (ffebld list, ffelexToken list_t, ffebld dovar, ffelexToken dovar_t);static void ffeexpr_update_impdo_ (ffebld expr, ffebld dovar);static void ffeexpr_update_impdo_sym_ (ffebld expr, ffesymbol dovar);static ffeexprContext ffeexpr_context_outer_ (ffeexprStack_ s);static ffeexprExpr_ ffeexpr_expr_new_ (void);static void ffeexpr_fulfill_call_ (ffebld *expr, ffelexToken t);static bool ffeexpr_isdigits_ (const char *p);static ffelexHandler ffeexpr_token_first_lhs_ (ffelexToken t);static ffelexHandler ffeexpr_token_first_lhs_1_ (ffelexToken t);static ffelexHandler ffeexpr_token_first_rhs_ (ffelexToken t);static ffelexHandler ffeexpr_token_first_rhs_1_ (ffelexToken t);static ffelexHandler ffeexpr_token_first_rhs_2_ (ffelexToken t);static ffelexHandler ffeexpr_token_first_rhs_3_ (ffelexToken t);static ffelexHandler ffeexpr_token_first_rhs_4_ (ffelexToken t);static ffelexHandler ffeexpr_token_first_rhs_5_ (ffelexToken t);static ffelexHandler ffeexpr_token_first_rhs_6_ (ffelexToken t);static ffelexHandler ffeexpr_token_namelist_ (ffelexToken t);static void ffeexpr_expr_kill_ (ffeexprExpr_ e);static void ffeexpr_exprstack_push_ (ffeexprExpr_ e);static void ffeexpr_exprstack_push_binary_ (ffeexprExpr_ e);static void ffeexpr_exprstack_push_operand_ (ffeexprExpr_ e);static void ffeexpr_exprstack_push_unary_ (ffeexprExpr_ e);static void ffeexpr_reduce_ (void);static ffebld ffeexpr_reduced_bool1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_bool2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_concatenate_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_eqop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_math1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_math2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_power_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_relop2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_ugly1_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_ugly1log_ (ffebld reduced, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_ugly2_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op, ffeexprExpr_ r);static ffebld ffeexpr_reduced_ugly2log_ (ffebld reduced, ffeexprExpr_ l, ffeexprExpr_ op, ffeexprExpr_ r);static ffelexHandler ffeexpr_find_close_paren_ (ffelexToken t, ffelexHandler after);static ffelexHandler ffeexpr_nil_finished_ (ffelexToken t);static ffelexHandler ffeexpr_nil_rhs_ (ffelexToken t);static ffelexHandler ffeexpr_nil_period_ (ffelexToken t);static ffelexHandler ffeexpr_nil_end_period_ (ffelexToken t);static ffelexHandler ffeexpr_nil_swallow_period_ (ffelexToken t);static ffelexHandler ffeexpr_nil_real_ (ffelexToken t);static ffelexHandler ffeexpr_nil_real_exponent_ (ffelexToken t);static ffelexHandler ffeexpr_nil_real_exp_sign_ (ffelexToken t);static ffelexHandler ffeexpr_nil_number_ (ffelexToken t);static ffelexHandler ffeexpr_nil_number_exponent_ (ffelexToken t);static ffelexHandler ffeexpr_nil_number_exp_sign_ (ffelexToken t);static ffelexHandler ffeexpr_nil_number_period_ (ffelexToken t);static ffelexHandler ffeexpr_nil_number_per_exp_ (ffelexToken t);static ffelexHandler ffeexpr_nil_number_real_ (ffelexToken t);static ffelexHandler ffeexpr_nil_num_per_exp_sign_ (ffelexToken t);static ffelexHandler ffeexpr_nil_number_real_exp_ (ffelexToken t);static ffelexHandler ffeexpr_nil_num_real_exp_sn_ (ffelexToken t);static ffelexHandler ffeexpr_nil_binary_ (ffelexToken t);static ffelexHandler ffeexpr_nil_binary_period_ (ffelexToken t);static ffelexHandler ffeexpr_nil_binary_end_per_ (ffelexToken t);static ffelexHandler ffeexpr_nil_binary_sw_per_ (ffelexToken t);static ffelexHandler ffeexpr_nil_quote_ (ffelexToken t);static ffelexHandler ffeexpr_nil_apostrophe_ (ffelexToken t);static ffelexHandler ffeexpr_nil_apos_char_ (ffelexToken t);static ffelexHandler ffeexpr_nil_name_rhs_ (ffelexToken t);static ffelexHandler ffeexpr_nil_name_apos_ (ffelexToken t);static ffelexHandler ffeexpr_nil_name_apos_name_ (ffelexToken t);static ffelexHandler ffeexpr_nil_percent_ (ffelexToken t);static ffelexHandler ffeexpr_nil_percent_name_ (ffelexToken t);static ffelexHandler ffeexpr_nil_substrp_ (ffelexToken t);static ffelexHandler ffeexpr_finished_ (ffelexToken t);static ffebld ffeexpr_finished_ambig_ (ffelexToken t, ffebld expr);static ffelexHandler ffeexpr_token_lhs_ (ffelexToken t);static ffelexHandler ffeexpr_token_rhs_ (ffelexToken t);static ffelexHandler ffeexpr_token_binary_ (ffelexToken t);static ffelexHandler ffeexpr_token_period_ (ffelexToken t);static ffelexHandler ffeexpr_token_end_period_ (ffelexToken t);static ffelexHandler ffeexpr_token_swallow_period_ (ffelexToken t);static ffelexHandler ffeexpr_token_real_ (ffelexToken t);static ffelexHandler ffeexpr_token_real_exponent_ (ffelexToken t);static ffelexHandler ffeexpr_token_real_exp_sign_ (ffelexToken t);static ffelexHandler ffeexpr_token_number_ (ffelexToken t);static ffelexHandler ffeexpr_token_number_exponent_ (ffelexToken t);static ffelexHandler ffeexpr_token_number_exp_sign_ (ffelexToken t);static ffelexHandler ffeexpr_token_number_period_ (ffelexToken t);static ffelexHandler ffeexpr_token_number_per_exp_ (ffelexToken t);static ffelexHandler ffeexpr_token_number_real_ (ffelexToken t);static ffelexHandler ffeexpr_token_num_per_exp_sign_ (ffelexToken t);static ffelexHandler ffeexpr_token_number_real_exp_ (ffelexToken t);static ffelexHandler ffeexpr_token_num_real_exp_sn_ (ffelexToken t);static ffelexHandler ffeexpr_token_binary_period_ (ffelexToken t);static ffelexHandler ffeexpr_token_binary_end_per_ (ffelexToken t);static ffelexHandler ffeexpr_token_binary_sw_per_ (ffelexToken t);static ffelexHandler ffeexpr_token_quote_ (ffelexToken t);static ffelexHandler ffeexpr_token_apostrophe_ (ffelexToken t);static ffelexHandler ffeexpr_token_apos_char_ (ffelexToken t);static ffelexHandler ffeexpr_token_name_lhs_ (ffelexToken t);static ffelexHandler ffeexpr_token_name_arg_ (ffelexToken t);static ffelexHandler ffeexpr_token_name_rhs_ (ffelexToken t);static ffelexHandler ffeexpr_token_name_apos_ (ffelexToken t);static ffelexHandler ffeexpr_token_name_apos_name_ (ffelexToken t);static ffelexHandler ffeexpr_token_percent_ (ffelexToken t);static ffelexHandler ffeexpr_token_percent_name_ (ffelexToken t);static ffelexHandler ffeexpr_token_arguments_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_token_elements_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_token_equivalence_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_token_substring_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_token_substring_1_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_token_substrp_ (ffelexToken t);static ffelexHandler ffeexpr_token_intrincheck_ (ffelexToken t);static ffelexHandler ffeexpr_token_funsubstr_ (ffelexToken ft, ffebld expr, ffelexToken t);static ffelexHandler ffeexpr_token_anything_ (ffelexToken ft, ffebld expr, ffelexToken t);static void ffeexpr_make_float_const_ (char exp_letter, ffelexToken integer, ffelexToken decimal, ffelexToken fraction, ffelexToken exponent, ffelexToken exponent_sign, ffelexToken exponent_digits);static ffesymbol ffeexpr_declare_unadorned_ (ffelexToken t, bool maybe_intrin);static ffesymbol ffeexpr_sym_impdoitem_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_lhs_call_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_lhs_data_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_lhs_equivalence_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_lhs_extfunc_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_lhs_impdoctrl_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_lhs_parameter_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_rhs_actualarg_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_rhs_dimlist_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_sym_rhs_let_ (ffesymbol s, ffelexToken t);static ffesymbol ffeexpr_declare_parenthesized_ (ffelexToken t, bool maybe_intrin, ffeexprParenType_ *paren_type);static ffesymbol ffeexpr_paren_rhs_let_ (ffesymbol s, ffelexToken t);/* Internal macros. */#define ffeexpr_paren_lhs_let_(s,t) ffeexpr_sym_rhs_let_(s,t)#define ffeexpr_sym_lhs_let_(s,t) ffeexpr_sym_rhs_let_(s,t)/* ffeexpr_collapse_convert -- Collapse convert expr ffebld expr; ffelexToken token; expr = ffeexpr_collapse_convert(expr,token); If the result of the expr is a constant, replaces the expr with the computed constant. */ffebldffeexpr_collapse_convert (ffebld expr, ffelexToken t){ ffebad error = FFEBAD; ffebld l; ffebldConstantUnion u; ffeinfoBasictype bt; ffeinfoKindtype kt; ffetargetCharacterSize sz; ffetargetCharacterSize sz2; if (ffeinfo_where (ffebld_info (expr)) != FFEINFO_whereCONSTANT) return expr; l = ffebld_left (expr); if (ffebld_op (l) != FFEBLD_opCONTER) return expr; switch (bt = ffeinfo_basictype (ffebld_info (expr))) { case FFEINFO_basictypeANY: return expr; case FFEINFO_basictypeINTEGER: sz = FFETARGET_charactersizeNONE; switch (kt = ffeinfo_kindtype (ffebld_info (expr))) {#if FFETARGET_okINTEGER1 case FFEINFO_kindtypeINTEGER1: switch (ffeinfo_basictype (ffebld_info (l))) { case FFEINFO_basictypeINTEGER:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -