2

二重記号のテキストを確認する必要があります。たとえば、「1 + 1 * 2」は問題ありませんが、「1 ** 2+3」または「-1+4*3」は問題ありません。精神計算の例の一部を考えてみましょう。

     expression =
            term[_val=_1]
            >> *(   ('+' >> term[_val+=_1])
                    |   ('-' >> term[_val-=_1])
                );

      term =
            factor[_val=_1]
            >> *(   ('*' >> factor[_val*=_1])
                |   ('/' >> factor[_val/=_1])
                );

      factor =
            double_[_val=_1]
            |   '(' >> expression[_val=_1] >> ')'
            |   ('-' >> factor[_val=_1])
            |   ('+' >> factor[_val=_1]);

phrase_parseは、「1 +++1」や「1**-1」などの式でtrueを返します。私はこのように繰り返しを使用しようとしました:

      term =
            factor[_val=_1]
            >> *(   (repeat(0)[char_('*')] >> factor[_val*=_1])
                |   ('/' >> factor[_val/=_1])
                );

しかし、それは役に立ちません。何が恋しいですか?ありがとう。

編集:答えを見つけました。phrase_parseの出力の後に文字列イテレーターを比較する必要がありますが、phrase_parseの出力は比較しないでください。

4

2 に答える 2

0

答えが見つかりました。phrase_parseの出力の後に文字列イテレーターを比較する必要がありますが、phrase_parseの出力は比較しないでください。

于 2012-12-18T11:27:13.313 に答える
0

この場合、factorは+を再帰的に受け入れるため、「1 ++++ + 1」は正しく解析されます(おそらく単項+/-を意図しています)。

それを分割する

  factor = ('-' >>  value[_val=-_1])
         | ('+' >> value[_val= _1])
         | value [_val = _1];
  value = double_ | '(' >> expression >> ')'
于 2012-12-30T08:27:58.453 に答える