• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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