00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef RBBI_BLD_H
00010 #define RBBI_BLD_H
00011
00012 #include "rbbi.h"
00013 #include "rbbi_tbl.h"
00014 #include "unicode/uniset.h"
00015 #include "uvector.h"
00016
00017 class ExpressionList;
00018
00019
00020
00021
00044 class RuleBasedBreakIteratorBuilder {
00045
00046 protected:
00050 RuleBasedBreakIterator& iterator;
00051
00055 RuleBasedBreakIteratorTables* tables;
00056
00060 UVector tempRuleList;
00061
00066 UVector categories;
00067
00071 int32_t numCategories;
00072
00077 ExpressionList* expressions;
00078
00082 UnicodeSet ignoreChars;
00083
00087 UVector tempStateTable;
00088
00094 UVector decisionPointList;
00095
00100 UStack decisionPointStack;
00101
00105 UVector loopingStates;
00106
00112 UVector statesToBackfill;
00113
00120 UVector mergeList;
00121
00126 UBool clearLoopingStates;
00127
00133 UnicodeString errorMessage;
00134
00139 static const int32_t END_STATE_FLAG ;
00140
00145 static const int32_t DONT_LOOP_FLAG ;
00146
00151 static const int32_t LOOKAHEAD_STATE_FLAG ;
00152
00157 static const int32_t ALL_FLAGS
00158 ;
00159
00160 public:
00161
00165 RuleBasedBreakIteratorBuilder(RuleBasedBreakIterator& iteratorToBuild);
00166
00170 ~RuleBasedBreakIteratorBuilder();
00171
00176 virtual void buildBreakIterator(const UnicodeString& description,
00177 UErrorCode& err);
00178
00179 private:
00180
00189 virtual void buildRuleList(UnicodeString& description,
00190 UErrorCode& err);
00191
00192 protected:
00193
00201 virtual void processSubstitution(UnicodeString& description,
00202 UTextOffset ruleStart,
00203 UTextOffset ruleEnd,
00204 UTextOffset startPos,
00205 UErrorCode& err);
00206
00216 virtual void handleSpecialSubstitution(const UnicodeString& replace,
00217 const UnicodeString& replaceWith,
00218 int32_t startPos,
00219 const UnicodeString& description,
00220 UErrorCode& err);
00221
00226 virtual void mungeExpressionList();
00227
00236 virtual void buildCharCategories(UErrorCode& err);
00237
00238 private:
00239
00245 virtual void buildStateTable(UErrorCode& err);
00246
00254 virtual void parseRule(const UnicodeString& rule,
00255 UBool forward);
00256
00265 virtual void updateStateTable(const UVector& rows,
00266 const UnicodeString& pendingChars,
00267 int16_t newValue);
00268
00289 virtual void mergeStates(int32_t rowNum,
00290 int16_t* newValues,
00291 const UVector& rowsBeingUpdated);
00292
00300 virtual int32_t searchMergeList(int32_t a, int32_t b);
00301
00312 virtual void setLoopingStates(const UVector* newLoopingStates,
00313 const UVector& endStates);
00314
00320 virtual void eliminateBackfillStates(int32_t baseState);
00321
00326 virtual void backfillLoopingStates(void);
00327
00334 virtual void finishBuildingStateTable(UBool forward);
00335
00341 virtual void buildBackwardsStateTable(UErrorCode& err);
00342
00343 protected:
00344
00353 virtual void setUpErrorMessage(const UnicodeString& message,
00354 int32_t position,
00355 const UnicodeString& context);
00356 };
00357
00358 #endif