aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/icu/common/rbbinode.h
blob: 94218b00c846ad7df7dd6265aeb3edc1e864bd4f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html 
/******************************************************************** 
 * COPYRIGHT: 
 * Copyright (c) 2001-2016, International Business Machines Corporation and 
 * others. All Rights Reserved. 
 ********************************************************************/ 
 
#ifndef RBBINODE_H 
#define RBBINODE_H 
 
#include "unicode/utypes.h" 
#include "unicode/unistr.h" 
#include "unicode/uobject.h" 
 
// 
//  class RBBINode 
// 
//                    Represents a node in the parse tree generated when reading 
//                    a rule file. 
// 
 
U_NAMESPACE_BEGIN 
 
class    UnicodeSet; 
class    UVector; 
 
class RBBINode : public UMemory { 
    public: 
        enum NodeType { 
            setRef, 
            uset, 
            varRef, 
            leafChar, 
            lookAhead, 
            tag, 
            endMark, 
            opStart, 
            opCat, 
            opOr, 
            opStar, 
            opPlus, 
            opQuestion, 
            opBreak, 
            opReverse, 
            opLParen 
        }; 
 
        enum OpPrecedence {       
            precZero, 
            precStart, 
            precLParen, 
            precOpOr, 
            precOpCat 
        }; 
             
        NodeType      fType; 
        RBBINode      *fParent; 
        RBBINode      *fLeftChild; 
        RBBINode      *fRightChild; 
        UnicodeSet    *fInputSet;           // For uset nodes only. 
        OpPrecedence  fPrecedence;          // For binary ops only. 
         
        UnicodeString fText;                // Text corresponding to this node. 
                                            //   May be lazily evaluated when (if) needed 
                                            //   for some node types. 
        int           fFirstPos;            // Position in the rule source string of the 
                                            //   first text associated with the node. 
                                            //   If there's a left child, this will be the same 
                                            //   as that child's left pos. 
        int           fLastPos;             //  Last position in the rule source string 
                                            //    of any text associated with this node. 
                                            //    If there's a right child, this will be the same 
                                            //    as that child's last postion. 
 
        UBool         fNullable;            // See Aho. 
        int32_t       fVal;                 // For leafChar nodes, the value. 
                                            //   Values are the character category, 
                                            //   corresponds to columns in the final 
                                            //   state transition table. 
 
        UBool         fLookAheadEnd;        // For endMark nodes, set TRUE if 
                                            //   marking the end of a look-ahead rule. 
 
        UBool         fRuleRoot;            // True if this node is the root of a rule. 
        UBool         fChainIn;             // True if chaining into this rule is allowed 
                                            //     (no '^' present). 
 
        UVector       *fFirstPosSet; 
        UVector       *fLastPosSet;         // TODO: rename fFirstPos & fLastPos to avoid confusion. 
        UVector       *fFollowPos; 
 
 
        RBBINode(NodeType t); 
        RBBINode(const RBBINode &other); 
        ~RBBINode(); 
         
        RBBINode    *cloneTree(); 
        RBBINode    *flattenVariables(); 
        void         flattenSets(); 
        void         findNodes(UVector *dest, RBBINode::NodeType kind, UErrorCode &status); 
 
#ifdef RBBI_DEBUG 
        static void printNodeHeader(); 
        static void printNode(const RBBINode *n); 
        static void printTree(const RBBINode *n, UBool withHeading); 
#endif 
 
    private: 
        RBBINode &operator = (const RBBINode &other); // No defs. 
        UBool operator == (const RBBINode &other);    // Private, so these functions won't accidently be used. 
 
#ifdef RBBI_DEBUG 
    public: 
        int           fSerialNum;           //  Debugging aids. 
#endif 
}; 
 
#ifdef RBBI_DEBUG 
U_CFUNC void  
RBBI_DEBUG_printUnicodeString(const UnicodeString &s, int minWidth=0); 
#endif 
 
U_NAMESPACE_END 
 
#endif