@@ -30,11 +30,16 @@ class CSymbol
30
30
void Append (QChar charter) {m_symbol.append (charter);}
31
31
void Clear () {m_symbol.clear ();}
32
32
TType GetType () const {return m_type;}
33
- protected:
33
+ QDataStream& WriteToQDataStream (QDataStream& out) const ;
34
+ QDataStream& ReadFromQDataStream (QDataStream& in);
35
+ public:
34
36
QString m_symbol;
35
37
TType m_type;
36
38
};
37
39
40
+ QDataStream& operator >>(QDataStream& in, CSymbol& s);
41
+ QDataStream& operator <<(QDataStream& out, const CSymbol& s);
42
+
38
43
inline uint qHash (const CSymbol& c) {return ::qHash (c.GetString ());}
39
44
40
45
class CTerminal : public CSymbol
@@ -45,6 +50,9 @@ class CTerminal : public CSymbol
45
50
static QSet<QString> CTerminalQSetToQStringQSet (const QSet<CTerminal>& csymbolSet);
46
51
};
47
52
53
+ QDataStream& operator >>(QDataStream& in, CTerminal& s);
54
+ QDataStream& operator <<(QDataStream& out, const CTerminal& s);
55
+
48
56
class CNonTerminal : public CSymbol
49
57
{
50
58
public:
@@ -53,56 +61,18 @@ class CNonTerminal : public CSymbol
53
61
static QSet<QString> CNonTerminalQSetToQStringQSet (const QSet<CNonTerminal>& csymbolSet);
54
62
};
55
63
56
- // typedef CSymbol* CSymbol;
64
+ QDataStream& operator >>(QDataStream& in, CNonTerminal& s);
65
+ QDataStream& operator <<(QDataStream& out, const CNonTerminal& s);
57
66
58
67
class CCFGRule
59
68
{
60
69
public:
61
- CCFGRule (){; }
70
+ CCFGRule (){}
62
71
CCFGRule (CNonTerminal leftNonTerminal, QVector<CSymbol> rightString)
63
72
:m_leftNonTerminal(leftNonTerminal), m_rightString(rightString)
64
73
{}
65
- // CCFGRule(QString rule)
66
- // {
67
- // QStringList leftAndRightPart = rule.split("->");
68
-
69
- // // Rule has to have 2 parts
70
- // if(leftAndRightPart.size()!= 2) return;
71
-
72
- // // Get left non-terminal
73
- // QString leftPart = leftAndRightPart[0];
74
- // QString leftNonterminal;
75
- // const QRegExp leftNonTermExp("^s*<s*(\\w+)s*>s*$");
76
- // if(leftNonTermExp.exactMatch(leftPart))
77
- // {
78
- // leftNonTermExp.indexIn(leftPart);
79
- // leftNonterminal = leftNonTermExp(1);
80
- // }
81
- // else
82
- // { // Left part did not match Backus–Naur Form
83
- // return;
84
- // }
85
-
86
- // // Get right rule part
87
- // //
88
- // // First split rule with |
89
- // QStringList rightRules;
90
- // QVector<QVector<CSymbol>> rightPartRules;
91
- // foreach(QString rightPartRule , rightRules)
92
- // {
93
- // rightPartRule.split("<>")
94
- // }
95
-
96
- // }
97
-
98
- ~CCFGRule ()
99
- {
100
- ;
101
- // foreach(CSymbol symbolPtr, rightString)
102
- // {
103
- // delete symbolPtr;
104
- // }
105
- }
74
+
75
+ ~CCFGRule (){}
106
76
static ErrorCode GetRulesFromString (QSet<CCFGRule>& rules, QString sRule );
107
77
bool operator ==(const CCFGRule &r) const {
108
78
return ((this ->m_leftNonTerminal == r.m_leftNonTerminal ) && (this ->m_rightString == r.m_rightString ));
@@ -118,8 +88,13 @@ class CCFGRule
118
88
CNonTerminal m_leftNonTerminal;
119
89
QVector<CSymbol> m_rightString;
120
90
QVector<QString> GetRevertedRightRule ();
91
+ QDataStream& WriteToQDataStream (QDataStream &out) const ;
92
+ QDataStream& ReadFromQDataStream (QDataStream &in);
121
93
};
122
94
95
+ QDataStream& operator <<(QDataStream &out, const CCFGRule& r);
96
+ QDataStream& operator >>(QDataStream &in, CCFGRule& r);
97
+
123
98
inline uint qHash (const CCFGRule& c){
124
99
return (::qHash (c.m_leftNonTerminal .GetString ()) /* ^ ::qHash(c.m_rightString)*/ );
125
100
}
@@ -144,12 +119,10 @@ class CContextFreeGrammar
144
119
ErrorCode GetFromBackusNaurForm (QString sContextFreeGrammar );
145
120
QString ToBackusNaurForm () const ;
146
121
bool operator ==(const CContextFreeGrammar& g)const ;
147
- void Clear (){
148
- m_nonTerminalsAlphabet.clear ();
149
- m_terminalsAlphabet.clear ();
150
- m_startNonTerminal.Clear ();
151
- m_rules.clear ();
152
- }
122
+ void Clear ();
123
+ QDataStream & WriteToQDataStream (QDataStream & stream) const ;
124
+ QDataStream & ReadFromQDataStream (QDataStream & stream);
125
+
153
126
protected:
154
127
QSet<CNonTerminal> m_nonTerminalsAlphabet;
155
128
QSet<CTerminal> m_terminalsAlphabet;
@@ -158,5 +131,10 @@ class CContextFreeGrammar
158
131
159
132
QList<CCFGRule> GetListOfRules () const ;
160
133
};
134
+
135
+ QDataStream &operator <<(QDataStream& out, const CContextFreeGrammar& g);
136
+ QDataStream &operator >> (QDataStream &in, CContextFreeGrammar& g);
137
+
138
+
161
139
// bool operator==(const CContextFreeGrammar& g1, const CContextFreeGrammar& g2);
162
140
#endif // CONTEXTFREEGRAMMAR_H
0 commit comments