1 /******************************************************************** 2 * COPYRIGHT: 3 * Copyright (c) 2001-2006, International Business Machines Corporation and 4 * others. All Rights Reserved. 5 ********************************************************************/ 6 7 #ifndef RBBINODE_H 8 #define RBBINODE_H 9 10 #include "unicode/utypes.h" 11 #include "unicode/uobject.h" 12 13 // 14 // class RBBINode 15 // 16 // Represents a node in the parse tree generated when reading 17 // a rule file. 18 // 19 20 U_NAMESPACE_BEGIN 21 22 class UnicodeSet; 23 class UVector; 24 25 class RBBINode : public UMemory { 26 public: 27 enum NodeType { 28 setRef, 29 uset, 30 varRef, 31 leafChar, 32 lookAhead, 33 tag, 34 endMark, 35 opStart, 36 opCat, 37 opOr, 38 opStar, 39 opPlus, 40 opQuestion, 41 opBreak, 42 opReverse, 43 opLParen 44 }; 45 46 enum OpPrecedence { 47 precZero, 48 precStart, 49 precLParen, 50 precOpOr, 51 precOpCat 52 }; 53 54 NodeType fType; 55 RBBINode *fParent; 56 RBBINode *fLeftChild; 57 RBBINode *fRightChild; 58 UnicodeSet *fInputSet; // For uset nodes only. 59 OpPrecedence fPrecedence; // For binary ops only. 60 61 UnicodeString fText; // Text corresponding to this node. 62 // May be lazily evaluated when (if) needed 63 // for some node types. 64 int fFirstPos; // Position in the rule source string of the 65 // first text associated with the node. 66 // If there's a left child, this will be the same 67 // as that child's left pos. 68 int fLastPos; // Last position in the rule source string 69 // of any text associated with this node. 70 // If there's a right child, this will be the same 71 // as that child's last postion. 72 73 UBool fNullable; // See Aho. 74 int32_t fVal; // For leafChar nodes, the value. 75 // Values are the character category, 76 // corresponds to columns in the final 77 // state transition table. 78 79 UBool fLookAheadEnd; // For endMark nodes, set TRUE if 80 // marking the end of a look-ahead rule. 81 82 UVector *fFirstPosSet; 83 UVector *fLastPosSet; // TODO: rename fFirstPos & fLastPos to avoid confusion. 84 UVector *fFollowPos; 85 86 87 RBBINode(NodeType t); 88 RBBINode(const RBBINode &other); 89 ~RBBINode(); 90 91 RBBINode *cloneTree(); 92 RBBINode *flattenVariables(); 93 void flattenSets(); 94 void findNodes(UVector *dest, RBBINode::NodeType kind, UErrorCode &status); 95 96 #ifdef RBBI_DEBUG 97 void printNode(); 98 void printTree(UBool withHeading); 99 #endif 100 101 private: 102 RBBINode &operator = (const RBBINode &other); // No defs. 103 UBool operator == (const RBBINode &other); // Private, so these functions won't accidently be used. 104 105 #ifdef RBBI_DEBUG 106 int fSerialNum; // Debugging aids. 107 #endif 108 }; 109 110 #ifdef RBBI_DEBUG 111 U_CFUNC void 112 RBBI_DEBUG_printUnicodeString(const UnicodeString &s, int minWidth=0); 113 #endif 114 115 U_NAMESPACE_END 116 117 #endif 118 119