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
00034 #include <lestes/common.hh>
00035 #include <lestes/std/source_location.hh>
00036 #include <lestes/lang/cplus/sem/as_decl.g.hh>
00037 #include <lestes/lang/cplus/sem/as_declarator_op2ss_type.g.hh>
00038 #include <lestes/lang/cplus/sem/sa_declarator.g.hh>
00039 #include <lestes/lang/cplus/sem/sa_decl_spec.g.hh>
00040 #include <lestes/lang/cplus/sem/as_other.g.hh>
00041 #include <lestes/lang/cplus/sem/ss_type_builtin.g.hh>
00042 #include <lestes/lang/cplus/sem/ss_type.g.hh>
00043 #include <lestes/lang/cplus/sem/ss_declaration.g.hh>
00044 #include <lestes/lang/cplus/sem/ss_misc.g.hh>
00045 #include <lestes/lang/cplus/sem/ss_decl_name.g.hh>
00046 #include <lestes/lang/cplus/sem/ss_expression.g.hh>
00047 #include <lestes/lang/cplus/sem/or_or.g.hh>
00048 #include <lestes/lang/cplus/sem/ss_statement.g.hh>
00049
00050 #include <iostream>
00051
00052 package(lestes);
00053 package(lang);
00054 package(cplus);
00055 package(sem);
00056
00057
00058
00059
00060
00061 ptr<as_declarator_op2ss_type> sa_declarator_context::create_as_declarator_op2ss_type(void)
00062 {
00063 return as_declarator_op2ss_type::create(decl_specs->type_get()
00064
00065
00066 );
00067 }
00068
00069
00070
00071
00072
00073
00074
00075 void sa_declarator::process(ptr<as_declarator> declarator)
00076 {
00077 lassert(declarator);
00078
00079
00080 ptr<as_declarator_op2ss_type> v = context->create_as_declarator_op2ss_type();
00081
00082 typedef ::lestes::std::list< srp<as_declarator_op> > as_declarator_op_list_type;
00083 ptr<as_declarator_op_list_type> lst = declarator->declarator_ops_get();
00084
00085 {
00086 as_declarator_op_list_type::reverse_iterator rit = lst->rbegin(),
00087 rend = lst->rend(), tit = lst->rbegin();
00088 ++tit;
00089
00090
00091 for ( ; tit != rend; ++rit, ++tit) {
00092
00093 v->process(*rit,false);
00094 }
00095
00096
00097 v->process(*rit,true);
00098 }
00099
00100
00101
00102 ptr<source_location> loc = source_location::create(file_info::create("",NULL),1,1);
00103 ptr<ss_type> type = v->type_get();
00104 ptr<ss_decl_seq> parent_scope = context->parent_scope_get();
00105 ptr<sa_decl_spec> decl_specs = context->decl_specs_get();
00106
00107
00108
00109 if (v->parameters_get()) {
00110
00111 #if 0
00112 ptr<ss_sp> psp = ss_sp::create(loc,NULL,NULL,0);
00113 ptr<ss_sp> nsp = ss_sp::create(loc,NULL,NULL,0);
00114 ptr<ss_sp> dsp = ss_sp::create(loc,NULL,NULL,0);
00115 psp->nsp_set(dsp);
00116 dsp->nsp_set(nsp);
00117 dsp->psp_set(psp);
00118 nsp->psp_set(dsp);
00119
00120 ptr<ss_decl_seq> decl_seq = ss_decl_seq::create(
00121 loc,
00122 v->parameters_get(),
00123 context->parent_scope_get(),
00124 NULL,
00125 list< srp<ss_using_directive> >::create(),
00126 NULL
00127 );
00128
00129 ptr<ss_compound_stmt> stmt = ss_compound_stmt::create(
00130 loc, list< srp<ss_label> >::create(),
00131
00132 NULL,
00133 psp,nsp,list< srp<ss_sp> >::create(),
00134 decl_seq,
00135 list< srp<ss_statement> >::create(), dsp);
00136
00137 decl_seq->compound_stmt_set(stmt);
00138 decl_seq->declared_by_set(declaration);
00139 decl_seq->contents_get()->push_back(class_decl_alias);
00140 parent_scope->contents_get()->push_back(class_decl);
00141 #endif
00142
00143
00144
00145 declaration = ss_function_declaration::create(
00146 loc,
00147
00148 ss_declaration_time::create(loc->order_get()),
00149 ss_declaration_time::create(loc->order_get()),
00150
00151 NULL,
00152 parent_scope,
00153 v->type_get(),
00154
00155 ss_linkage::create("C++",ss_linkage::LINKAGE_EXTERNAL),
00156
00157 NULL,
00158 NULL
00159 );
00160
00161 } else {
00162 if (decl_specs->virtual_flag_get() ||
00163 decl_specs->explicit_flag_get() ||
00164 decl_specs->inline_flag_get()) {
00165
00166 }
00167
00168 if (decl_specs->storage_class_get() == ss_storage_class::ST_TYPEDEF) {
00169
00170 ptr < ss_declaration_time > dt = ss_declaration_time::create(loc->order_get());
00171
00172 declaration = ss_typedef_definition::create(
00173 loc,
00174 dt,
00175 dt,
00176
00177 NULL,
00178 parent_scope,
00179 type,
00180 ss_linkage::create("C++",ss_linkage::LINKAGE_NO),
00181 context->access_specifier_get(),
00182 ss_storage_class::ST_TYPEDEF
00183 );
00184
00185 } else {
00186 ptr < ss_declaration_time > dt = ss_declaration_time::create(loc->order_get());
00187 declaration = ss_object_declaration::create(
00188 loc,
00189 dt,
00190 dt,
00191
00192 NULL,
00193 parent_scope,
00194 type,
00195
00196 NULL,
00197 ss_access_specifier::ACCESS_PUBLIC,
00198
00199 ss_storage_class::ST_NONE,
00200 ss_declaration_time::infinity(),
00201 NULL
00202 );
00203 }
00204 }
00205
00206
00207 parent_scope->contents_get()->push_back(declaration);
00208 }
00209
00210 end_package(sem);
00211 end_package(cplus);
00212 end_package(lang);
00213 end_package(lestes);
00214