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