os/textandloc/fontservices/textshaperplugin/IcuSource/common/rbbinode.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /********************************************************************
     2  * COPYRIGHT:
     3  * Copyright (c) 2001-2003, 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 #else
   100         // Do-nothing inline functions for non-debug builds.  Can't make empty defines for member
   101         //   functions - they won't compile at the call sites.
   102         int         fakeField;
   103         #define printNode() fakeField=0;
   104         #define printTree(withHeading) fakeField=0;
   105 #endif
   106 
   107     private:
   108         RBBINode &operator = (const RBBINode &other); // No defs.
   109         UBool operator == (const RBBINode &other);    // Private, so these functions won't accidently be used.
   110 
   111         int           fSerialNum;           //  Debugging aids.
   112         static int    gLastSerial;
   113 };
   114 
   115 #ifdef RBBI_DEBUG
   116 U_CFUNC void 
   117 RBBI_DEBUG_printUnicodeString(const UnicodeString &s, int minWidth=0);
   118 #endif
   119 
   120 U_NAMESPACE_END
   121 
   122 #endif
   123