コードに Context Free Grammar を実装するために、いくつかのクラスを作成する必要があります。CFGには「左辺→右辺」という形式の制作規則があります。それらは次のように実装されます。
class GrammarProduction{
public:
Nonterminal mLhs;
std::vector<GrammarSymbol*> mRhs;
プロダクション ルールを std::set に保存して、誰も重複したルールを追加できないようにしたいと考えています。重複検出を機能させるために、以下に示すように GrammarProductions の operator< を実装しました。
bool GrammarProduction::operator<(const GrammarProduction& other) const{
if (mLhs < other.Lhs()) return true;
if (mRhs.size() < other.Rhs().size()) return true;
std::vector<GrammarSymbol*>::const_iterator it1, it2;
it2 = other.Rhs().begin();
for(it1 = mRhs.begin(); it1 != mRhs.end(); it1++){
std::cout << (*it1) << std::endl;
std::cout << (*it2) << std::endl;
if(**it1 < **it2) return true;
it2++;
}
return false;
}
このコードを実行すると、次の行でセグメンテーション違反が発生します
if(**it1 < **it2) return true;
ポインター *it2 が null であるためです。ただし、 *it2 を出力する行を変更すると
std::cout << (*it2) << other.Str() << std::endl;
それは問題なく動作し、*it2 は null ではありません。その理由がわかりません。アドバイスをいただければ幸いです。呼び出される関数を投稿する必要がある場合は、投稿します。質問にとって重要ではなく、かなりの量になることを願っているため(少なくとも投稿の場合)、そうしませんでした。
編集:問題を絞り込みましたが、これに要約されます
bool GrammarProduction::operator<(const GrammarProduction& other) const{
std::vector<GrammarSymbol*>::const_iterator it1, it2;
it1 = mRhs.begin();
std::cout << "it1:" << std::endl;
std::cout << (*(mRhs.begin()))->Str() << std::endl; //output (1,2,2)
std::cout << (*it1)->Str() << std::endl; //output (1,2,2)
it2 = other.Rhs().begin();
std::cout << "it2:" << std::endl;
std::cout << (*(other.Rhs().begin()))->Str() << std::endl; //output (1,2,2)
std::cout << (*it2)->Str() << std::endl; //Segmentation Fault
//do whatever
return false;
}