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