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