|
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 |