]> git.saurik.com Git - apple/icu.git/blame - icuSources/common/rbbitblb.h
ICU-400.37.tar.gz
[apple/icu.git] / icuSources / common / rbbitblb.h
CommitLineData
b75a7d8f
A
1//
2// rbbitblb.h
3//
4
5/*
6**********************************************************************
73c04bcf 7* Copyright (c) 2002-2005, International Business Machines
b75a7d8f
A
8* Corporation and others. All Rights Reserved.
9**********************************************************************
10*/
11
12#ifndef RBBITBLB_H
13#define RBBITBLB_H
14
15#include "unicode/utypes.h"
16#include "unicode/uobject.h"
17#include "unicode/rbbi.h"
18#include "rbbinode.h"
19
20
21U_NAMESPACE_BEGIN
22
23class RBBIRuleScanner;
24class RBBIRuleBuilder;
25
26//
27// class RBBITableBuilder is part of the RBBI rule compiler.
28// It builds the state transition table used by the RBBI runtime
29// from the expression syntax tree generated by the rule scanner.
30//
31// This class is part of the RBBI implementation only.
32// There is no user-visible public API here.
33//
34
35class RBBITableBuilder : public UMemory {
36public:
37 RBBITableBuilder(RBBIRuleBuilder *rb, RBBINode **rootNode);
38 ~RBBITableBuilder();
39
40 void build();
374ca955 41 int32_t getTableSize() const; // Return the runtime size in bytes of
b75a7d8f
A
42 // the built state table
43 void exportTable(void *where); // fill in the runtime state table.
44 // Sufficient memory must exist at
45 // the specified location.
46
374ca955 47
b75a7d8f
A
48private:
49 void calcNullable(RBBINode *n);
50 void calcFirstPos(RBBINode *n);
51 void calcLastPos(RBBINode *n);
52 void calcFollowPos(RBBINode *n);
374ca955 53 void calcChainedFollowPos(RBBINode *n);
73c04bcf 54 void bofFixup();
b75a7d8f
A
55 void buildStateTable();
56 void flagAcceptingStates();
57 void flagLookAheadStates();
58 void flagTaggedStates();
374ca955 59 void mergeRuleStatusVals();
b75a7d8f
A
60
61 // Set functions for UVector.
62 // TODO: make a USet subclass of UVector
63
64 void setAdd(UVector *dest, UVector *source);
65 UBool setEquals(UVector *a, UVector *b);
66
374ca955
A
67 void sortedAdd(UVector **dest, int32_t val);
68
69public:
70#ifdef RBBI_DEBUG
b75a7d8f 71 void printSet(UVector *s);
374ca955 72 void printPosSets(RBBINode *n /* = NULL*/);
b75a7d8f 73 void printStates();
374ca955
A
74 void printRuleStatusTable();
75#else
76 #define printSet(s)
77 #define printPosSets(n)
78 #define printStates()
79 #define printRuleStatusTable()
80#endif
b75a7d8f
A
81
82private:
83 RBBIRuleBuilder *fRB;
84 RBBINode *&fTree; // The root node of the parse tree to build a
85 // table for.
86 UErrorCode *fStatus;
87
88 UVector *fDStates; // D states (Aho's terminology)
89 // Index is state number
90 // Contents are RBBIStateDescriptor pointers.
91
374ca955 92
b75a7d8f
A
93 RBBITableBuilder(const RBBITableBuilder &other); // forbid copying of this class
94 RBBITableBuilder &operator=(const RBBITableBuilder &other); // forbid copying of this class
95};
96
97//
98// RBBIStateDescriptor - The DFA is constructed as a set of these descriptors,
99// one for each state.
100class RBBIStateDescriptor : public UMemory {
101public:
102 UBool fMarked;
103 int32_t fAccepting;
104 int32_t fLookAhead;
374ca955
A
105 UVector *fTagVals;
106 int32_t fTagsIdx;
b75a7d8f
A
107 UVector *fPositions; // Set of parse tree positions associated
108 // with this state. Unordered (it's a set).
109 // UVector contents are RBBINode *
110
111 UVector *fDtran; // Transitions out of this state.
112 // indexed by input character
113 // contents is int index of dest state
114 // in RBBITableBuilder.fDStates
115
116 RBBIStateDescriptor(int maxInputSymbol, UErrorCode *fStatus);
117 ~RBBIStateDescriptor();
118
119private:
120 RBBIStateDescriptor(const RBBIStateDescriptor &other); // forbid copying of this class
121 RBBIStateDescriptor &operator=(const RBBIStateDescriptor &other); // forbid copying of this class
122};
123
124
125
126U_NAMESPACE_END
127#endif