00001 #ifndef __cmt_symbol_h__
00002 #define __cmt_symbol_h__
00003
00004 #include "cmt_tag.h"
00005 #include "cmt_use.h"
00006
00007 class SymbolValue
00008 {
00009 public:
00010 typedef cmt_vector<SymbolValue> SymbolValueVector;
00011
00012 SymbolValue ();
00013 ~SymbolValue ();
00014
00015 Tag* tag;
00016 cmt_string text;
00017
00018 int selected;
00019 };
00020
00021 class SymbolValueList
00022 {
00023 public:
00024 typedef cmt_vector<SymbolValueList> SymbolValueListVector;
00025
00026 int select_first (const cmt_string& tag_name = "") const;
00027 int select_last () const;
00028
00029 CommandType command_type;
00030 Use* use;
00031 SymbolValue::SymbolValueVector values;
00032 bool is_reflexive;
00033 bool discarded;
00034 };
00035
00036 class Symbol;
00037
00038 class ValueBuilder
00039 {
00040 public:
00041 virtual const cmt_string& build (const Symbol& symbol,
00042 const cmt_string& tag_name = "") = 0;
00043 virtual const cmt_string& clean (const Symbol& symbol,
00044 const cmt_string& tag_name = "") = 0;
00045 };
00046
00047 class Symbol
00048 {
00049 public:
00050 typedef cmt_vector<Symbol> SymbolVector;
00051
00052 static Symbol* create (const cmt_string& name,
00053 CommandType command,
00054 ScopeType scope);
00055 static Symbol* find (const cmt_string& name);
00056 static void action (const CmtSystem::cmt_string_vector& words,
00057 CommandType command_type,
00058 Use* use);
00059 static int is_selected (const cmt_string& name);
00060 static void all_print (PrintMode mode);
00061 static void all_print_clean (PrintMode mode);
00062 static int symbol_number ();
00063 static SymbolVector& symbols ();
00064 static Symbol& symbol (int index);
00065 static void clear_all ();
00066 static void expand (cmt_string& text);
00067
00068 public:
00069 Symbol ();
00070 ~Symbol ();
00071 bool value_is_reflexive (const cmt_string& text) const;
00072 void add_value_to_list (CommandType command_type,
00073 Use* use,
00074 Tag* tag,
00075 const cmt_string& text);
00076
00077 int valid (PrintMode mode);
00078 int print_clean (int tabs, PrintMode mode);
00079 int print (int tabs, PrintMode mode);
00080 cmt_string build_macro_value () const;
00081 cmt_string clean_macro_value () const;
00082 cmt_string resolve_macro_value (const cmt_string& tag_name = "");
00083 void show_macro (PrintMode mode);
00084
00085 ValueBuilder* builder;
00086
00087 cmt_string name;
00088 ScopeType scope;
00089 CommandType command;
00090
00091 SymbolValueList::SymbolValueListVector value_lists;
00092
00093 int selected_value;
00094 };
00095
00096 #endif