2017-02-17 16 views
1

インスタンス名とパスの解析が必要な文法を実装したいと考えています。パスはディバイダで区切られたインスタンス名のリストです。分周器は、どちらか.(ピリオド)または/(スラッシュ)パスがリストされている前に、入力ファイルに与えられた、例えばことができます。一度設定するとブーストスピリット:ローカル変数値を変更してchar_を解析する

DIVIDER . 
a.b.c 
x.y.z 

に設定すると、分周器はファイル全体(つまりために変更されることはありません.a/b/cなどのパスに遭遇すると、正しく解析されません)。あらかじめ分数が何であるかわからないので、私はそれを私の文法の変数に格納し、対応するchar_パーサーでその値を使用することを考えています(実際の文法ははるかに複雑ですが、これは私が困っている部分)。

これは多分この質問に似ています:Boost spirit using local variables Nabialekトリックを使用すると、除算器が設定された後に "無効な"パスを解析することができます。

私はここで完全な解決策を求めていませんが、私の質問は本質的にこれです。私の文法のメンバーに値を解析し、残りの入力をさらに解析するためにこれらの値を使用できますか?

答えて

3

私が継承された属性を使用したい:

qi::rule<It, std::string(char)> element = *~qi::char_(qi::_r1); 
qi::rule<It, std::vector<std::string>(char)> path = element(qi::_r1) % qi::char_(qi::_r1); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path('/'), data); 

はまた、あなたが/ /確かにローカル変数にバインドすることができます:あなたは動的にすることが必要な場合は、boost::phoenix::refを使用

char delim = '/'; 
qi::rule<It, std::string()> element = *~qi::char_(delim); 
qi::rule<It, std::vector<std::string>()> path = element % qi::char_(delim); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path, data); 

char delim = '/'; 
qi::rule<It, std::string()> element = *~qi::char_(boost::phoenix::ref(delim)); 
qi::rule<It, std::vector<std::string>()> path = element % qi::char_(boost::phoenix::ref(delim)); 

// use it like: 
std::vector<std::string> data; 
bool ok = qi::parse(f, l, path, data); 
+0

私の最初のアプローチはほとんどこのように見えましたが、私は無限ループのようなものに遭遇しました。少なくとも私はそれが可能であることを知っている。月曜日にやり直して報告します。 – tickferno

+0

はい、それは美しく動作します。どうもありがとう! EDIT:継承された属性を持つ最初のバリアントを使用しました。私にとって最もきれいで読みやすい解決策のようです。 – tickferno

関連する問題