]> matita.cs.unibo.it Git - helm.git/blob - helm/DEVEL/mathml_editor/src/TDictionary.hh
Bug fixed: wrong exception was raised (instead of returning false)
[helm.git] / helm / DEVEL / mathml_editor / src / TDictionary.hh
1 /* This file is part of EdiTeX, an editor of mathematical
2  * expressions based on TeX syntax.
3  * 
4  * Copyright (C) 2002-2003 Luca Padovani <lpadovan@cs.unibo.it>,
5  *                    2003 Paolo Marinelli <pmarinel@cs.unibo.it>.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  * For more information, please visit the project's home page
22  * http://helm.cs.unibo.it/editex/
23  * or send an email to <lpadovan@cs.unibo.it>
24  */
25
26 #ifndef __TDictionary_hh__
27 #define __TDictionary_hh__
28
29 #include <config.h>
30
31 #include <string>
32 #include <vector>
33 #if defined(HAVE_EXT_HASH_MAP)
34 #include <ext/hash_map>
35 #elif defined(HAVE_HASH_MAP)
36 #include <hash_map>
37 #else
38 #error "no hash_map could be found"
39 #endif
40 #include <list>
41
42 #include "dom.hh"
43 #include "TToken.hh"
44
45 class TDictionary
46 {
47 public:
48   TDictionary(class ALogger& l) : logger(l) { };
49   ~TDictionary() { };
50
51   enum Form
52     {
53       INFIX,
54       PREFIX,
55       POSTFIX
56     };
57
58   enum EntryClass
59     {
60       UNDEFINED,
61       MACRO,
62       OPERATOR,
63       IDENTIFIER,
64       NUMBER
65     };
66
67   struct Entry
68   {
69     Entry(void)
70     { 
71       cls = UNDEFINED;
72       table = delimiter = limits = embellishment = leftOpen = rightOpen = 0;
73     };
74
75     std::vector<TToken> pattern;
76     std::string value;
77
78     bool defined(void) const { return cls != UNDEFINED; };
79     bool hasArguments(void) const { return !pattern.empty(); };
80     bool paramDelimited(unsigned) const;
81     bool lastDelimiter(unsigned) const;
82     unsigned previousParam(unsigned) const;
83
84     EntryClass cls;
85     unsigned delimiter : 1;
86     unsigned limits : 1;
87     unsigned embellishment : 1;
88     unsigned leftOpen : 1;
89     unsigned rightOpen : 1;
90     unsigned table : 1;
91   };
92
93   static std::string getDefaultDictionaryPath(void);
94
95   void load(const std::string&);
96   void load(const std::string&, const std::string&);
97   void load(const DOM::Document&, const std::string& = "");
98   const Entry& find(const std::string&) const;
99   std::string complete(const std::string, std::list<std::string>&) const;
100
101 private:
102 #if defined(HAVE_EXT_HASH_MAP)
103   struct StringHash : public std::unary_function< std::string, size_t >
104   { size_t operator()(const std::string& s) const { return __gnu_cxx::hash<char*>()(s.c_str()); } };
105 #elif defined(HAVE_HASH_MAP)
106   struct StringHash : public std::unary_function< std::string, size_t >
107   { size_t operator()(const std::string& s) const { return hash<char*>()(s.c_str()); } };
108 #else
109 #error "no hash_map could be found"
110 #endif
111
112 #if 0
113   struct StringEq : public std::binary_function< std::string, std::string, bool >
114   { bool operator()(const std::string&, const class String*) const; };
115 #endif
116
117   class ALogger& logger;
118 #if defined(HAVE_EXT_HASH_MAP)
119   typedef __gnu_cxx::hash_map< std::string, Entry, StringHash > Dictionary;
120 #elif defined(HAVE_HASH_MAP)
121   typedef std::hash_map< std::string, Entry, StringHash > Dictionary;
122 #else
123 #error "no hash_map could be found"
124 #endif
125   Dictionary entries;
126 };
127
128 #endif // __TDictionary_hh__
129