私はブーストスピリットフレームワークを使用して独自の文法を定義しようとしていると私は、このようなマッチングルールを定義しています - some_func - その部分に渡し、一致する文字列全体をパラメータとして渡します。しかし、残念ながら私はvector<boost::variant<boost::fusion::vector2 ..a lot of stuff...)...>
のようなものを得るでしょう。どういうわけか、char *、std :: string、またはvoid *のサイズでデータ全体を取得できますか? qi::as_stringでブーストスピリット文字列として全試合を取得
5
A
答えて
8
ルック:デモプログラムの
出力:
DEBUG: 'some\\"quoted\\"string.'
parse success
正直に言うと、あなたが本当に可能なエスケープ文字と「逐語的に」文字列を解析しようとしているように、それが見えます。その点に関しては、
lexeme
の使用は間違っているように見えます(スペースは食べられます)。エスケープされた文字列解析のサンプルを表示するには、
- Boost Spirit Implement small one-line DSL on a server application(このスタイル用)
- Compiling a simple parser with Boost.Spirit(重複によって脱出用)
- Parsing escaped strings with boost spirit
- Parse quoted strings with boost::spirit
私は、少なくとも、作ることができると考え、単純な再配置次のようになります。
0しかし、あなたは、単にスキッパーせずにルールを宣言し、alltogetherlexeme
をドロップすることができることを
ベクトルと何が間違っているコード(liveworkspaceに住んでいる)
#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
struct some_func_t
{
template <typename> struct result { typedef void type; };
template <typename T>
void operator()(T const& s) const
{
std::cout << "DEBUG: '" << s << "'\n";
}
};
template <typename It, typename Skipper = qi::space_type>
struct parser : qi::grammar<It, Skipper>
{
parser() : parser::base_type(value)
{
using namespace qi;
// using phx::bind; using phx::ref; using phx::val;
value = (
char_('"') >>
qi::as_string
[
(*qi::lexeme[
char_('\\') >> char_('\\') |
char_('\\') >> char_('"') |
graph - char_('"') |
char_(' ')
])
] [some_func(_1)] >>
char_('"')
);
BOOST_SPIRIT_DEBUG_NODE(value);
}
private:
qi::rule<It, Skipper> value;
phx::function<some_func_t> some_func;
};
bool doParse(const std::string& input)
{
typedef std::string::const_iterator It;
auto f(begin(input)), l(end(input));
parser<It, qi::space_type> p;
try
{
bool ok = qi::phrase_parse(f,l,p,qi::space);
if (ok)
{
std::cout << "parse success\n";
}
else std::cerr << "parse failed: '" << std::string(f,l) << "'\n";
if (f!=l) std::cerr << "trailing unparsed: '" << std::string(f,l) << "'\n";
return ok;
} catch(const qi::expectation_failure<It>& e)
{
std::string frag(e.first, e.last);
std::cerr << e.what() << "'" << frag << "'\n";
}
return false;
}
int main()
{
bool ok = doParse("\"some \\\"quoted\\\" string.\"");
return ok? 0 : 255;
}
関連する問題
- 1. モデルフィールドを文字列として取得
- 2. 文字列内の合計サブ文字列を取得する
- 3. grepを使って試合後に次の完全な文字列を得るには?
- 4. ブーストスピリットを使用した文字列の一致
- 5. C++分割文字列全体として別の文字列
- 6. スプリット文字列と文字列とC#での値を取得
- 7. 特定の文字列を文字列として取得する方法
- 8. 取得文字列ハイフン/ダッシュ( - )Iは、例えば、URLから文字列を取得しようとしてい
- 9. XSLT 1.0を使用して文字列全体を取得しますか?
- 10. 変数と文字列を結合して変数を取得する
- 11. 最低5文字試合
- 12. 2文字列と親文字列の間の文字列を取得する
- 13. 個別の先頭文字を取得して、列全体を返す
- 14. 文字列の組み合わせを行ごとに取得
- 15. ブーストスピリットで文字列に数値を解析するx3
- 16. Angular2:パラメータなしのURLを文字列として取得
- 17. text.getを使用して文字列と文字を取得する -
- 18. 文字列から完全なアドレスを取得する
- 19. asp:FileUploadオブジェクトから完全なファイルパス文字列を取得
- 20. SolrQueryの完全なクエリ文字列を取得する
- 21. 全体の文字列からハイパーリンクを取得する方法
- 22. 文字列[0]文字列の先頭文字を取得
- 23. 文字列から文字列の後に文字列を取得します
- 24. 取得とポストとクエリ文字列
- 25. ArrayList - 文字列を使用して "Contain"と "lastIndexOf"を取得
- 26. 辞書の配列から要素を取得し、文字列としてキーを保存し、文字列
- 27. 文字列を検索して文字列から次の文字列までのすべてを取得
- 28. 部分文字列と完全文字列の2つのリストと一致する場合は、文字列全体を返します。
- 29. optargをC++文字列オブジェクトとして取得
- 30. Threepenny-GUI:属性値を文字列として取得
? –
私はそれを >>>と記述しますが、それはseheによって編集されました。 –
Dejwi