2010-06-26 14 views
5

Aşağıdaki sonucu anlamlandırmaya çalışıyorum. test durumu kodu burada motivasyon i numaralama 12345 'tamsayı olarak ve ASLA olarak kayan noktaları eşleştirmek istediğiniz olmasıdırtamsayının ve kayan noktaların sayısal olarak ayrıştırılması

#include <boost/config/warning_disable.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/phoenix_core.hpp> 
#include <boost/spirit/include/phoenix_operator.hpp> 
#include <boost/spirit/include/phoenix_fusion.hpp> 
#include <boost/spirit/include/phoenix_stl.hpp> 
#include <boost/fusion/include/adapt_struct.hpp> 
#include <boost/variant/recursive_variant.hpp> 
#include <boost/spirit/home/support/context.hpp> 
#include <boost/spirit/home/phoenix.hpp> 
#include <boost/foreach.hpp> 

#include <iostream> 
#include <fstream> 
#include <string> 
#include <cstdlib> 
#include <vector> 

namespace sp = boost::spirit; 
namespace qi = boost::spirit::qi; 
using namespace boost::spirit::ascii; 

namespace fusion = boost::fusion; 
namespace phoenix = boost::phoenix; 

using phoenix::at_c; 
using phoenix::push_back; 
using phoenix::bind; 

template <typename P> 
void test_parser(
    char const* input, P const& p, bool full_match = true) 
{ 
    using boost::spirit::qi::parse; 

    char const* f(input); 
    char const* l(f + strlen(f)); 
    if (parse(f, l, p) && (!full_match || (f == l))) 
     std::cout << "ok" << std::endl; 
    else 
     std::cout << "fail" << std::endl; 
} 


int main() { 

test_parser("+12345", qi::int_); //Ok 
test_parser("+12345", qi::double_ - qi::int_); //failed, as expected 
test_parser("+12345.34", qi::int_); // failed, as expected 
test_parser("+12345.34", qi::double_ - qi::int_); //failed but it should be Ok! 
}; 

olduğunu. '12345.34', double_ ile eşleşmeyecek ve asla int_ değil ancak karşılıklı durum doğru değil; '12345' her iki tam sayı (int_) ve kayan nokta (double_) ile eşleşir. Double_ - int_ denedim ve '12345' ile eşleşemedi. Ancak umudum, '12345.34' son test vakasının double_ - int_ ile pozitif olarak eşleşmesiydi, fakat elde ettiğim sonuç eşleşmiyor.

bu böyledir ve nasıl ben sadece yüzer noktaları eşleşen bir tek tamsayılar maçları ayrıştırıcı ve başka alırım Neden çift- ile

cevap

14

Örneğiniz için, aslında RealPolicies Uzmanlık alanı altında Boost Spirit documentation numaralı makalede anlatılmaktadır. sizin için biraz daha kolay şeyler yapmak için, ben tek gerçek sayılar sayı değil ayrıştırma, hızlı bir "gerçek" ayrıştırıcı dışarı şanti (ya da en azından bu sizin basitleştirilmiş örneklerle çalıştı):

template <typename T> 
struct strict_real_policies : qi::real_policies<T> 
{ 
    static bool const expect_dot = true; 
}; 

qi::real_parser< double, strict_real_policies<double> > real; 

Ve kullanabilirsiniz Bu, diğer tüm ayrıştırıcılarda olduğu gibi (int_ ve double_ gibi). Derlemeniz için

. Bu B ile bunun _part_ eşleşebilir, B sonra eşleşirse A, AB Eşleşmeyecek maçları (ancak burada söz şeydir bir dize N verilmiş:

+0

+1 Bu daha iyi bir çözümdür. – academicRobot

+0

teşekkürler, bu mükemmel çalışıyor – lurscher

4

sorunu (gibi c, 5.0 yüzen noktası olarak yorumlanır) Not-int qi::double_ - qi::int_, bir ayrıştırıcının başarılı bir eşleşme olmak için tüm girdiyle eşleşmesi gerekmez. "+12345.34" için qi :: double_, her şeyde başarılı bir eşleşme yapar ve qi :: int, "+12345" te başarılı bir eşleşme yapar, böylece qi::double_ - qi::int_ eşleşmiyor. Fark operatörü için, her ayrıştırıcıyı ayrı ayrı uygulamayı ve girdinin ilk kısmı için her biri için geçerli bir eşleşme olup olmadığını düşünün.

İstediğiniz davranışı qi :: int_'den sonra bir çeşit sınır gerektirerek alabilirsiniz. Ne zaman bir qi :: int_ bir floatın ilk kısmı ile eşleştiğinde geçerli bir yüzdür (ör. "+12345.34" "+12345" ile eşleşir; Bu nedenle, bir float öncesinde olumsuz bir görünüm yapabilirsiniz:

int_rule %= qi::int_ >> !qi::double_; 

double_rule %= qi::double_ - int_rule; 

veya

double_rule %= qi::double_ - (qi::int_ >> !qi::double_); 

!qi::double da boşluk ve EOI için de geçerlidir, bu yüzden bu standart formatı için oldukça genel olması gerektiğini düşünüyorum. Bu, bilimsel gösterim için işe yaramaz.

+0

ah i AB operatörü olarak hareket düşünce her şey değil) çok sezgisel değil, ama şimdi anlıyorum, teşekkürler! – lurscher

İlgili konular