]>
Commit | Line | Data |
---|---|---|
46f4442e A |
1 | /* |
2 | ******************************************************************************* | |
3 | * Copyright (C) 2007-2008, International Business Machines Corporation and | |
4 | * others. All Rights Reserved. | |
5 | ******************************************************************************* | |
6 | * | |
7 | * File PLURRULE_IMPL.H | |
8 | * | |
9 | ******************************************************************************* | |
10 | */ | |
11 | ||
12 | ||
13 | #ifndef PLURRULE_IMPLE | |
14 | #define PLURRULE_IMPLE | |
15 | ||
16 | /** | |
17 | * \file | |
18 | * \brief C++ API: Defines rules for mapping positive long values onto a small set of keywords. | |
19 | */ | |
20 | ||
21 | #if !UCONFIG_NO_FORMATTING | |
22 | ||
23 | #include "unicode/format.h" | |
24 | #include "unicode/locid.h" | |
25 | #include "unicode/parseerr.h" | |
26 | #include "unicode/utypes.h" | |
27 | #include "uvector.h" | |
28 | #include "hash.h" | |
29 | ||
30 | U_NAMESPACE_BEGIN | |
31 | ||
32 | #define DOT ((UChar)0x002E) | |
33 | #define SINGLE_QUOTE ((UChar)0x0027) | |
34 | #define SLASH ((UChar)0x002F) | |
35 | #define BACKSLASH ((UChar)0x005C) | |
36 | #define SPACE ((UChar)0x0020) | |
37 | #define QUOTATION_MARK ((UChar)0x0022) | |
38 | #define NUMBER_SIGN ((UChar)0x0023) | |
39 | #define ASTERISK ((UChar)0x002A) | |
40 | #define COMMA ((UChar)0x002C) | |
41 | #define HYPHEN ((UChar)0x002D) | |
42 | #define U_ZERO ((UChar)0x0030) | |
43 | #define U_ONE ((UChar)0x0031) | |
44 | #define U_TWO ((UChar)0x0032) | |
45 | #define U_THREE ((UChar)0x0033) | |
46 | #define U_FOUR ((UChar)0x0034) | |
47 | #define U_FIVE ((UChar)0x0035) | |
48 | #define U_SIX ((UChar)0x0036) | |
49 | #define U_SEVEN ((UChar)0x0037) | |
50 | #define U_EIGHT ((UChar)0x0038) | |
51 | #define U_NINE ((UChar)0x0039) | |
52 | #define COLON ((UChar)0x003A) | |
53 | #define SEMI_COLON ((UChar)0x003B) | |
54 | #define CAP_A ((UChar)0x0041) | |
55 | #define CAP_B ((UChar)0x0042) | |
56 | #define CAP_R ((UChar)0x0052) | |
57 | #define CAP_Z ((UChar)0x005A) | |
58 | #define LOWLINE ((UChar)0x005F) | |
59 | #define LEFTBRACE ((UChar)0x007B) | |
60 | #define RIGHTBRACE ((UChar)0x007D) | |
61 | ||
62 | #define LOW_A ((UChar)0x0061) | |
63 | #define LOW_B ((UChar)0x0062) | |
64 | #define LOW_C ((UChar)0x0063) | |
65 | #define LOW_D ((UChar)0x0064) | |
66 | #define LOW_E ((UChar)0x0065) | |
67 | #define LOW_F ((UChar)0x0066) | |
68 | #define LOW_G ((UChar)0x0067) | |
69 | #define LOW_H ((UChar)0x0068) | |
70 | #define LOW_I ((UChar)0x0069) | |
71 | #define LOW_J ((UChar)0x006a) | |
72 | #define LOW_K ((UChar)0x006B) | |
73 | #define LOW_L ((UChar)0x006C) | |
74 | #define LOW_M ((UChar)0x006D) | |
75 | #define LOW_N ((UChar)0x006E) | |
76 | #define LOW_O ((UChar)0x006F) | |
77 | #define LOW_P ((UChar)0x0070) | |
78 | #define LOW_Q ((UChar)0x0071) | |
79 | #define LOW_R ((UChar)0x0072) | |
80 | #define LOW_S ((UChar)0x0073) | |
81 | #define LOW_T ((UChar)0x0074) | |
82 | #define LOW_U ((UChar)0x0075) | |
83 | #define LOW_V ((UChar)0x0076) | |
84 | #define LOW_W ((UChar)0x0077) | |
85 | #define LOW_Y ((UChar)0x0079) | |
86 | #define LOW_Z ((UChar)0x007A) | |
87 | ||
88 | ||
89 | #define PLURAL_RANGE_HIGH 0x7fffffff; | |
90 | ||
91 | ||
92 | class UnicodeSet; | |
93 | ||
94 | typedef enum PluralKey { | |
95 | pZero, | |
96 | pOne, | |
97 | pTwo, | |
98 | pFew, | |
99 | pMany, | |
100 | pOther, | |
101 | pLast | |
102 | }PluralKey; | |
103 | ||
104 | typedef enum tokenType { | |
105 | none, | |
106 | tLetter, | |
107 | tNumber, | |
108 | tComma, | |
109 | tSemiColon, | |
110 | tSpace, | |
111 | tColon, | |
112 | tDot, | |
113 | tKeyword, | |
114 | tZero, | |
115 | tOne, | |
116 | tTwo, | |
117 | tFew, | |
118 | tMany, | |
119 | tOther, | |
120 | tAnd, | |
121 | tOr, | |
122 | tMod, | |
123 | tNot, | |
124 | tIn, | |
125 | tWithin, | |
126 | tNotIn, | |
127 | tVariableN, | |
128 | tIs, | |
129 | tLeftBrace, | |
130 | tRightBrace | |
131 | }tokenType; | |
132 | ||
133 | class RuleParser : public UMemory { | |
134 | public: | |
135 | RuleParser(); | |
136 | virtual ~RuleParser(); | |
137 | void getNextToken(const UnicodeString& ruleData, int32_t *ruleIndex, UnicodeString& token, | |
138 | tokenType& type, UErrorCode &status); | |
139 | void checkSyntax(tokenType prevType, tokenType curType, UErrorCode &status); | |
140 | private: | |
141 | UnicodeSet *idStartFilter; | |
142 | UnicodeSet *idContinueFilter; | |
143 | ||
144 | void getKeyType(const UnicodeString& token, tokenType& type, UErrorCode &status); | |
145 | UBool inRange(UChar ch, tokenType& type); | |
146 | UBool isValidKeyword(const UnicodeString& token); | |
147 | }; | |
148 | ||
149 | class AndConstraint : public UMemory { | |
150 | public: | |
151 | typedef enum RuleOp { | |
152 | NONE, | |
153 | MOD | |
154 | } RuleOp; | |
155 | RuleOp op; | |
156 | int32_t opNum; | |
157 | int32_t rangeLow; | |
158 | int32_t rangeHigh; | |
159 | UBool notIn; | |
160 | UBool integerOnly; | |
161 | AndConstraint *next; | |
162 | ||
163 | AndConstraint(); | |
164 | AndConstraint(const AndConstraint& other); | |
165 | virtual ~AndConstraint(); | |
166 | AndConstraint* add(); | |
167 | UBool isFulfilled(double number); | |
168 | int32_t updateRepeatLimit(int32_t maxLimit); | |
169 | }; | |
170 | ||
171 | class OrConstraint : public UMemory { | |
172 | public: | |
173 | AndConstraint *childNode; | |
174 | OrConstraint *next; | |
175 | OrConstraint(); | |
176 | ||
177 | OrConstraint(const OrConstraint& other); | |
178 | virtual ~OrConstraint(); | |
179 | AndConstraint* add(); | |
180 | UBool isFulfilled(double number); | |
181 | }; | |
182 | ||
183 | class RuleChain : public UMemory { | |
184 | public: | |
185 | OrConstraint *ruleHeader; | |
186 | UnicodeString keyword; | |
187 | RuleChain(); | |
188 | RuleChain(const RuleChain& other); | |
189 | RuleChain *next; | |
190 | ||
191 | virtual ~RuleChain(); | |
192 | UnicodeString select(double number) const; | |
193 | void dumpRules(UnicodeString& result); | |
194 | int32_t getRepeatLimit(); | |
195 | UErrorCode getKeywords(int32_t maxArraySize, UnicodeString *keywords, int32_t& arraySize) const; | |
196 | UBool isKeyword(const UnicodeString& keyword) const; | |
197 | void setRepeatLimit(); | |
198 | private: | |
199 | int32_t repeatLimit; | |
200 | }; | |
201 | ||
202 | class PluralKeywordEnumeration : public StringEnumeration { | |
203 | public: | |
204 | PluralKeywordEnumeration(RuleChain *header, UErrorCode& status); | |
205 | virtual ~PluralKeywordEnumeration(); | |
206 | static UClassID U_EXPORT2 getStaticClassID(void); | |
207 | virtual UClassID getDynamicClassID(void) const; | |
208 | virtual const UnicodeString* snext(UErrorCode& status); | |
209 | virtual void reset(UErrorCode& status); | |
210 | virtual int32_t count(UErrorCode& status) const; | |
211 | private: | |
212 | int32_t pos; | |
213 | UVector fKeywordNames; | |
214 | }; | |
215 | ||
216 | U_NAMESPACE_END | |
217 | ||
218 | #endif /* #if !UCONFIG_NO_FORMATTING */ | |
219 | ||
220 | #endif // _PLURRULE_IMPL | |
221 | //eof |