xorp

visitor_semantic.hh

00001 // -*- c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t -*-
00002 // vim:set sts=4 ts=8:
00003 
00004 // Copyright (c) 2001-2011 XORP, Inc and Others
00005 //
00006 // This program is free software; you can redistribute it and/or modify
00007 // it under the terms of the GNU General Public License, Version 2, June
00008 // 1991 as published by the Free Software Foundation. Redistribution
00009 // and/or modification of this program under the terms of any other
00010 // version of the GNU General Public License is not permitted.
00011 // 
00012 // This program is distributed in the hope that it will be useful, but
00013 // WITHOUT ANY WARRANTY; without even the implied warranty of
00014 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For more details,
00015 // see the GNU General Public License, Version 2, a copy of which can be
00016 // found in the XORP LICENSE.gpl file.
00017 // 
00018 // XORP Inc, 2953 Bunker Hill Lane, Suite 204, Santa Clara, CA 95054, USA;
00019 // http://xorp.net
00020 
00021 // $XORP: xorp/policy/visitor_semantic.hh,v 1.17 2008/10/02 21:58:02 bms Exp $
00022 
00023 #ifndef __POLICY_VISITOR_SEMANTIC_HH__
00024 #define __POLICY_VISITOR_SEMANTIC_HH__
00025 
00026 
00027 
00028 #include "libxorp/xorp.h"
00029 
00030 #include "policy/common/varrw.hh"
00031 #include "policy/common/dispatcher.hh"
00032 
00033 #include "visitor.hh"
00034 #include "semantic_varrw.hh"
00035 #include "set_map.hh"
00036 #include "policy_statement.hh"
00037 #include "node.hh"
00038 
00046 class VisitorSemantic :
00047     public NONCOPYABLE,
00048     public Visitor
00049 {
00050 public:
00051     enum PolicyType {
00052     IMPORT,
00053     EXPORT
00054     };
00055 
00059     class sem_error : public PolicyException {
00060     public:
00061         sem_error(const char* file, size_t line, const string& init_why = "")
00062             : PolicyException("sem_error", file, line, init_why) {}
00063     };
00064 
00073     VisitorSemantic(SemanticVarRW& varrw, VarMap& varmap, SetMap& setmap,
00074             PolicyMap& pmap, const string& protocol, PolicyType ptype);
00075 
00076     const Element* visit(PolicyStatement& policy);
00077     const Element* visit(Term& term);
00078     const Element* visit(NodeUn& node);
00079     const Element* visit(NodeBin& node);
00080     const Element* visit(NodeAssign& node);
00081     const Element* visit(NodeVar& node);
00082     const Element* visit(NodeSet& node);
00083     const Element* visit(NodeElem& node);
00084     const Element* visit(NodeAccept& node);
00085     const Element* visit(NodeReject& node);
00086     const Element* visit(NodeProto& node);
00087     const Element* visit(NodeNext& node);
00088     const Element* visit(NodeSubr& node);
00089 
00094     const set<string>& sets() const {
00095     return _sets;
00096     }
00097 
00098 private:
00099     void        change_protocol(const string& proto);
00100     const string&   semantic_protocol();
00101     const Element*  do_bin(const Element& left, const Element& right,
00102                const BinOper& op, const Node& from);
00103     void        do_policy_statement(PolicyStatement& ps);
00104 
00105     SemanticVarRW&  _varrw;
00106     VarMap&     _varmap;
00107     SetMap&     _setmap;
00108     PolicyMap&      _pmap;
00109     Dispatcher      _disp;
00110     set<string>     _sets;
00111     string      _protocol;
00112     string      _current_protocol;
00113     string      _semantic_protocol;
00114     PolicyType      _ptype;
00115     set<Element*>   _trash;
00116     bool        _reject;
00117 };
00118 
00119 #endif // __POLICY_VISITOR_SEMANTIC_HH__
 All Classes Namespaces Functions Variables Typedefs Enumerations