// file : CCF/IDL2/SemanticAction/Impl/Elements.hpp // author : Boris Kolpackov // cvs-id : $Id$ #ifndef CCF_IDL2_SEMANTIC_ACTION_IMPL_ELEMENTS_HPP #define CCF_IDL2_SEMANTIC_ACTION_IMPL_ELEMENTS_HPP #include #include "CCF/IDL2/SemanticGraph/Translation.hpp" #include "CCF/IDL2/SemanticGraph/IntExpression.hpp" #include "CCF/IDL2/SemanticAction/Elements.hpp" /* Design notes: (1) I am using stack-based approach to handle cases like this: struct A { struct B { struct C { ... } c; } b; }; Even though you can't write the same let's say for interface I am still using stack approach for consistency and possible meta-coding. */ namespace CCF { namespace IDL2 { namespace SemanticAction { namespace Impl { // // // class Context { public: Context (bool trace, SemanticGraph::TranslationUnit& tu, CompilerElements::Context& parsing_context) : trace_ (trace), tu_ (tu), parsing_context_ (parsing_context) { } bool trace () { return trace_; } SemanticGraph::TranslationUnit& tu () const { return tu_; } SemanticGraph::Scope& scope () const { return *scope_; } void scope (SemanticGraph::Scope& scope) { scope_ = &scope; } SemanticGraph::TranslationRegion& region () const { return *region_; } void region (SemanticGraph::TranslationRegion& r) { region_ = &r; } CompilerElements::Context& parsing_context () const { return parsing_context_; } SemanticGraph::Path const& file () const { return parsing_context_.get ("file-path"); } public: void int_exp_push (SemanticGraph::IntExpression& e) { int_exp_stack_.push (&e); } SemanticGraph::IntExpression& int_exp_pop () { SemanticGraph::IntExpression& e (*int_exp_stack_.top ()); int_exp_stack_.pop (); return e; } std::size_t int_exp_size () { return int_exp_stack_.size (); } void int_exp_flush () { while (int_exp_stack_.size ()) int_exp_stack_.pop (); } private: bool trace_; SemanticGraph::TranslationUnit& tu_; SemanticGraph::TranslationRegion* region_; SemanticGraph::Scope* scope_; CompilerElements::Context& parsing_context_; std::stack int_exp_stack_; private: Context (Context const&); void operator= (Context const&); }; // // // class Base { protected: virtual ~Base () { } Base (Context& c) : ctx (c) { } protected: class Resolve {}; template struct ExceptionTemplate : Resolve { explicit ExceptionTemplate (SemanticGraph::ScopedName name) : name_ (name) { } SemanticGraph::ScopedName name () const { return name_; } private: SemanticGraph::ScopedName name_; }; struct NotFound : Resolve {}; class WrongType_ {}; typedef ExceptionTemplate WrongType; class NotUnique : Resolve {}; class NotDefined_ {}; typedef ExceptionTemplate NotDefined; class NotComplete_ {}; typedef ExceptionTemplate NotComplete; struct Flags { enum Value { none = 0x00, complete = 0x01, defined = 0x02 }; }; template T& resolve (SemanticGraph::ScopedName const& from, SemanticGraph::Name const& name, Flags::Value flags = Flags::none) throw (NotFound, NotUnique, WrongType, NotDefined, NotComplete); class AlreadyInherited_ {}; typedef ExceptionTemplate AlreadyInherited; class AlreadySupported_ {}; typedef ExceptionTemplate AlreadySupported; template void check_inheritance (I begin, I end, SemanticGraph::Nameable& t) throw (AlreadyInherited); template void check_support (I begin, I end, SemanticGraph::Nameable& t) throw (AlreadySupported); protected: Context& ctx; }; // // // template class ScopeBase : public Base { protected: ScopeBase (Context& c) : Base (c) { } protected: T& now () const { return *now_; } void now (T& t) { now_ = &t; } void push (SemanticGraph::Scope& t) { stack_.push (&t); } void pop () { stack_.pop (); } SemanticGraph::Scope& top () { return *stack_.top (); } private: T* now_; std::stack stack_; }; // // // class NotFound {}; class NotUnique {}; SemanticGraph::Nameables resolve (SemanticGraph::TranslationUnit& tu, SemanticGraph::ScopedName const& from, SemanticGraph::Name const& name) throw (NotFound); SemanticGraph::Nameable* lookup (SemanticGraph::TranslationUnit& tu, SemanticGraph::Scope& in, SemanticGraph::SimpleName const& name) throw (NotUnique); } } } } #include "CCF/IDL2/SemanticAction/Impl/Elements.tpp" #endif // CCF_IDL2_SEMANTIC_ACTION_IMPL_ELEMENTS_HPP