2016-08-02 8 views
1

私はSpirit X3を使い始めました。私は最初のテストに関連して少し質問があります。なぜこの関数が "false"を返すのか知っていますか?Spirit X3で始まる

bool parse() 
{ 
    std::string rc = "a 6 literal 8"; 

    auto iter_begin = rc.begin(); 
    auto iter_end = rc.end(); 

    bool bOK= phrase_parse(iter_begin, iter_end, 
          // ----- start parser ----- 

          alpha >> *alnum >> "literal" >> *alnum 

          // ----- end parser ----- 
          , space); 

    return bOK && iter_begin == iter_end; 
} 

私はこの問題が、どのように文法を書くかと関連しているのを見ました。私がこれに置き換えた場合、「true」を返します。

alpha >> -alnum >> "literal" >> *alnum 

私は、ブースト1.61.0に含まれているスピリットバージョンを使用しています。事前に

おかげで、

セン

+0

ここでは、オンラインのコードをテストすることができますhttp://coliru.stacked-crooked.com/a/0ce333c6e9f75f66を – Sen

答えて

0

あなたの問題は、オペレータ*の貪欲とスキッパーの使用を組み合わせたものです。あなたはalnumPrimitiveParserであることを心に留めておく必要があり、それがこのパーサが試されるたびに前に、聖霊ますプリスキップすることを意味し、従ってあなたのパーサの動作は次のとおりです。

  • alphaaを解析します。
  • kleeneオペレータが起動します。
  • alnumは、スペースをスキップして、6を解析します。
  • alnumは、スペースをスキップして、lを解析します。
  • alnum parses i
  • ...
  • alnum構文解析l
  • alnumは、スペースをスキップして、8を解析します。
  • alnumは、より多くの解析を試み、失敗します。これにより、構文解析された属性が6literal8のkleene演算子が完成します。
  • "literal"が解析を試みて失敗します。
  • シーケンス演算子は失敗し、phrase_parseの呼び出しはfalseを返します。

あなたは簡単にlexemeディレクティブ(barebones x3 docsqi docs)を使用してこの問題を回避することができます。 thisような何か動作するはずです:

alpha >> lexeme[*alnum] >> "literal" >> lexeme[*alnum]; 
関連する問題