#include <macro_storage.hh>
Inheritance diagram for lestes::lang::cplus::lex::macro_storage:

Public Member Functions | |
| void | define (const ptr< macro > &a_macro) |
| Defines new macro. | |
| void | undef (const ptr< pp_token > &tok) |
| Undefines macro. | |
| bool | defined (const ptr< pp_token > &tok) |
| Tests whether a macro is defined. | |
| ptr< macro > | lookup (const ptr< token_value > &a_name) |
| Searches for a macro of given name. | |
| void | clear (void) |
| Discards user defined macros. | |
Static Public Member Functions | |
| static ptr< macro_storage > | create (void) |
| Returns new storage. | |
Protected Member Functions | |
| macro_storage (void) | |
| Constructs empty object. | |
| virtual void | gc_mark (void) |
| Marks the object. | |
Private Types | |
| typedef map< srp< token_value >, srp< macro > > | storage_type |
| Type of storage for macros. | |
Private Attributes | |
| srp< storage_type > | storage |
| Storage for macros. | |
Represents storage of defined macros. Handles definition, removal and lookup.
Definition at line 56 of file macro_storage.hh.
typedef map< srp<token_value>, srp<macro> > lestes::lang::cplus::lex::macro_storage::storage_type [private] |
| lestes::lang::cplus::lex::macro_storage::macro_storage | ( | void | ) | [protected] |
| void lestes::lang::cplus::lex::macro_storage::define | ( | const ptr< macro > & | a_macro | ) |
Defines new macro.
Defines new macro, checks for redefinition.
| a_macro | The macro to be defined. |
Definition at line 64 of file macro_storage.cc.
References lestes::is_equal(), lassert, lestes::lang::cplus::lex::macro_redefinition_different, lestes::lang::cplus::lex::predefined_macro_redefined, lestes::lang::cplus::lex::previous_definition, lestes::report, and storage.
00065 { 00066 lassert(a_macro); 00067 00068 ptr<token_value> name = a_macro->name_get(); 00069 00070 storage_type::iterator it = storage->find(name); 00071 if (it == storage->end()) { 00072 storage->insert(make_pair(name,a_macro)); 00073 return; 00074 } 00075 00076 ptr<macro> orig = (*it).second; 00077 if (orig->predefined_get()) { 00078 // redefinition of predefined internal macro 00079 report << predefined_macro_redefined << name->content_get() << a_macro->location_get(); 00080 return; 00081 } 00082 00083 // redefinition is equivalent, do nothing 00084 if (is_equal(a_macro,orig)) return; 00085 00086 // macro redefinition is different 00087 report << macro_redefinition_different << name->content_get() << a_macro->location_get(); 00088 // this is the location of the previous definition 00089 report << previous_definition << orig->location_get(); 00090 }
| void lestes::lang::cplus::lex::macro_storage::undef | ( | const ptr< pp_token > & | tok | ) |
Undefines macro.
Undefines macro, checks whether was defined.
| tok | The token with name of macro to undefine. |
Definition at line 98 of file macro_storage.cc.
References lestes::lang::cplus::lex::expected_macro_name, lassert, lestes::lang::cplus::lex::predefined_macro_undefined, lestes::report, and storage.
00099 { 00100 lassert(tok); 00101 00102 if (!tok->is_name()) { 00103 // expected name of macro to undefine 00104 report << expected_macro_name << tok->location_get(); 00105 return; 00106 } 00107 00108 ptr<token_value> name = tok->value_get(); 00109 00110 storage_type::iterator it = storage->find(name); 00111 if (it == storage->end()) return; 00112 00113 ptr<macro> m = (*it).second; 00114 00115 if (m->predefined_get()) { 00116 // undefining predefined macro 00117 report << predefined_macro_undefined << name->content_get() << tok->location_get(); 00118 return; 00119 } 00120 00121 storage->erase(it); 00122 }
| bool lestes::lang::cplus::lex::macro_storage::defined | ( | const ptr< pp_token > & | tok | ) |
Tests whether a macro is defined.
Tests whether macro of the given name is currently defined.
| tok | The token containing macro name to test. |
Definition at line 130 of file macro_storage.cc.
References lestes::lang::cplus::lex::expected_macro_name, lassert, lestes::report, and storage.
00131 { 00132 lassert(tok); 00133 00134 if (!tok->is_name()) { 00135 // expected name of macro 00136 report << expected_macro_name << tok->location_get(); 00137 // such macro is not defined 00138 return false; 00139 } 00140 00141 ptr<token_value> name = tok->value_get(); 00142 00143 return storage->find(name) != storage->end(); 00144 }
| ptr< macro > lestes::lang::cplus::lex::macro_storage::lookup | ( | const ptr< token_value > & | name | ) |
Searches for a macro of given name.
Searches for macro of given name.
| name | The name of the searched macro. |
Definition at line 153 of file macro_storage.cc.
References lassert, and storage.
00154 { 00155 lassert(name); 00156 00157 // TODO check special names (__LINE__) etc 00158 storage_type::iterator it = storage->find(name); 00159 if (it == storage->end()) return NULL; 00160 return (*it).second; 00161 }
| void lestes::lang::cplus::lex::macro_storage::clear | ( | void | ) |
Discards user defined macros.
| ptr< macro_storage > lestes::lang::cplus::lex::macro_storage::create | ( | void | ) | [static] |
Returns new storage.
Returns new instance of the class.
Definition at line 176 of file macro_storage.cc.
References macro_storage().
00177 { 00178 return new macro_storage(); 00179 }
| void lestes::lang::cplus::lex::macro_storage::gc_mark | ( | void | ) | [protected, virtual] |
Marks the object.
Marks the object.
Reimplemented from lestes::std::mem::keystone.
Definition at line 166 of file macro_storage.cc.
References lestes::std::mem::keystone::gc_mark(), and storage.
00167 { 00168 storage.gc_mark(); 00169 ::lestes::std::object::gc_mark(); 00170 }
srp<storage_type> lestes::lang::cplus::lex::macro_storage::storage [private] |
1.5.1-20070107