2

次のパーサーが解析に失敗する理由がわかりませんtest。の呼び出し後qi::phrase_parseresultは true にit2なり、文字列の末尾を指しますが、mynrまだ 0 です。

std::string test = "#define   SOMEMACRO 8.0";
  auto it2 = test.begin();
  auto endIt2 = test.end();
  double mynr = 0;
  bool result = 
    qi::phrase_parse(
      it2, 
      endIt2, 
      ("#define" >> (*qi::alnum) >> qi::double_[ref(mynr) = qi::_1]), 
      qi::space);

私はそれがqi::alnumスペーススキップと関係があるのではないかと疑っています。

ケースを個々のコンポーネントに減らしてみました。これら 3 つのパーサーを個別に検証したところ、次のことがわかりました。

  • 「#define」は実際に「#define」を消費します
  • (*qi::alnum)消費することができますSOMEMACRO
  • qi::double_消費することができます8.0

個別に、各パーサーは正常に動作しますが、上記の形式でまとめると奇妙に動作します。さらに小さなテストでは、私(*qi::alnum)が使用しているように使用するとSOMEMACRO、 .

4

1 に答える 1

2

あなたの更新により、実際に何が起こっているのかがわかりました。そして、あなたは正しいです、*alnumあなたが望むよりも多く食べています.

("#define" >> lexeme[*qi::alnum] >> (qi::double_)[boost::phoenix::ref(mynr) = boost::spirit::_1])

これは機能します。

*alnum英数字を食べて、それらの間のスペースをスキップしています。それで実際に食べましたSOMEMACRO 8。で、最後に食べたら効いたと言うと8.0、それはダブルパーサーが消費したからだ.0

上部の新しいパーサーでは*alnum、途中にスペースがないようにする必要があります。

文法に関する新しい注意事項は次のとおりです。

  1. double の値を格納するセマンティック アクションを含めました。という double に格納しmynrます。
  2. でラップ*alnumしましたlexeme。これにより、パーサーは内部で文字をスキップしなくなります。
  3. この正しい文法を使用すると、解析"#define SOMEMACRO 8.0"して"#define SOMEMACRO 8"
于 2013-03-22T15:10:11.847 に答える