Home | History | Annotate | Download | only in common
      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