OLD | NEW |
(Empty) | |
| 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 c
lass |
| 94 RBBITableBuilder &operator=(const RBBITableBuilder &other); // forbid copyin
g 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 associ
ated |
| 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 st
ate |
| 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 |
OLD | NEW |