1 // 2 // rbbitblb.h 3 // 4 5 /* 6 ********************************************************************** 7 * Copyright (c) 2002-2005, International Business Machines 8 * Corporation and others. All Rights Reserved. 9 ********************************************************************** 10 */ 11 12 #ifndef RBBITBLB_H 13 #define RBBITBLB_H 14 15 #include "unicode/utypes.h" 16 #include "unicode/uobject.h" 17 #include "unicode/rbbi.h" 18 #include "rbbinode.h" 19 20 21 U_NAMESPACE_BEGIN 22 23 class RBBIRuleScanner; 24 class RBBIRuleBuilder; 25 26 // 27 // class RBBITableBuilder is part of the RBBI rule compiler. 28 // It builds the state transition table used by the RBBI runtime 29 // from the expression syntax tree generated by the rule scanner. 30 // 31 // This class is part of the RBBI implementation only. 32 // There is no user-visible public API here. 33 // 34 35 class RBBITableBuilder : public UMemory { 36 public: 37 RBBITableBuilder(RBBIRuleBuilder *rb, RBBINode **rootNode); 38 ~RBBITableBuilder(); 39 40 void build(); 41 int32_t getTableSize() const; // Return the runtime size in bytes of 42 // the built state table 43 void exportTable(void *where); // fill in the runtime state table. 44 // Sufficient memory must exist at 45 // the specified location. 46 47 48 private: 49 void calcNullable(RBBINode *n); 50 void calcFirstPos(RBBINode *n); 51 void calcLastPos(RBBINode *n); 52 void calcFollowPos(RBBINode *n); 53 void calcChainedFollowPos(RBBINode *n); 54 void bofFixup(); 55 void buildStateTable(); 56 void flagAcceptingStates(); 57 void flagLookAheadStates(); 58 void flagTaggedStates(); 59 void mergeRuleStatusVals(); 60 61 // Set functions for UVector. 62 // TODO: make a USet subclass of UVector 63 64 void setAdd(UVector *dest, UVector *source); 65 UBool setEquals(UVector *a, UVector *b); 66 67 void sortedAdd(UVector **dest, int32_t val); 68 69 public: 70 #ifdef RBBI_DEBUG 71 void printSet(UVector *s); 72 void printPosSets(RBBINode *n /* = NULL*/); 73 void printStates(); 74 void printRuleStatusTable(); 75 #else 76 #define printSet(s) 77 #define printPosSets(n) 78 #define printStates() 79 #define printRuleStatusTable() 80 #endif 81 82 private: 83 RBBIRuleBuilder *fRB; 84 RBBINode *&fTree; // The root node of the parse tree to build a 85 // table for. 86 UErrorCode *fStatus; 87 88 UVector *fDStates; // D states (Aho's terminology) 89 // Index is state number 90 // Contents are RBBIStateDescriptor pointers. 91 92 93 RBBITableBuilder(const RBBITableBuilder &other); // forbid copying of this class 94 RBBITableBuilder &operator=(const RBBITableBuilder &other); // forbid copying of this class 95 }; 96 97 // 98 // RBBIStateDescriptor - The DFA is constructed as a set of these descriptors, 99 // one for each state. 100 class RBBIStateDescriptor : public UMemory { 101 public: 102 UBool fMarked; 103 int32_t fAccepting; 104 int32_t fLookAhead; 105 UVector *fTagVals; 106 int32_t fTagsIdx; 107 UVector *fPositions; // Set of parse tree positions associated 108 // with this state. Unordered (it's a set). 109 // UVector contents are RBBINode * 110 111 UVector *fDtran; // Transitions out of this state. 112 // indexed by input character 113 // contents is int index of dest state 114 // in RBBITableBuilder.fDStates 115 116 RBBIStateDescriptor(int maxInputSymbol, UErrorCode *fStatus); 117 ~RBBIStateDescriptor(); 118 119 private: 120 RBBIStateDescriptor(const RBBIStateDescriptor &other); // forbid copying of this class 121 RBBIStateDescriptor &operator=(const RBBIStateDescriptor &other); // forbid copying of this class 122 }; 123 124 125 126 U_NAMESPACE_END 127 #endif 128