• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 position.
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         bool operator == (const RBBINode &other);     // Private, so these functions won't accidentally 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