2012-11-07 17 views
8

Sto cercando un modo per analizzare una stringa come int o double, il parser dovrebbe provare entrambe le alternative e scegliere quella corrispondente alla parte più lunga del flusso di input.Parse int o double usando boost spirit (longest_d)

C'è una direttiva deprecato (longest_d) che fa esattamente quello che sto cercando:

number = longest_d[ integer | real ]; 

... visto che è deprecato, ci sono altre alternative? Nel caso in cui sia necessario implementare un'azione semantica per ottenere il comportamento desiderato, qualcuno ha un suggerimento?

risposta

13

In primo luogo, passare a Spirit V2 - che è sostituito da classic spirit per anni.

In secondo luogo, è necessario assicurarsi che un int venga preferito. Per impostazione predefinita, un doppio grado di analizzare qualsiasi intero altrettanto bene, quindi è necessario utilizzare strict_real_policies invece:

real_parser<double, strict_real_policies<double>> strict_double; 

Ora si può semplicemente affermare

number = strict_double | int_; 

Vedi

Vedere programma di test Live on Coliru

#include <boost/spirit/include/qi.hpp> 

using namespace boost::spirit::qi; 

using A = boost::variant<int, double>; 
static real_parser<double, strict_real_policies<double>> const strict_double; 

A parse(std::string const& s) 
{ 
    typedef std::string::const_iterator It; 
    It f(begin(s)), l(end(s)); 
    static rule<It, A()> const p = strict_double | int_; 

    A a; 
    assert(parse(f,l,p,a)); 

    return a; 
} 

int main() 
{ 
    assert(0 == parse("42").which()); 
    assert(0 == parse("-42").which()); 
    assert(0 == parse("+42").which()); 

    assert(1 == parse("42.").which()); 
    assert(1 == parse("0.").which()); 
    assert(1 == parse(".0").which()); 
    assert(1 == parse("0.0").which()); 
    assert(1 == parse("1e1").which()); 
    assert(1 == parse("1e+1").which()); 
    assert(1 == parse("1e-1").which()); 
    assert(1 == parse("-1e1").which()); 
    assert(1 == parse("-1e+1").which()); 
    assert(1 == parse("-1e-1").which()); 
} 
+0

E 'possibile che non capisco lo scenario della domanda, ma non sarebbe 'numero = double_ | int_' solo di lavoro? –

+0

@sehe, grazie mille, funziona come un fascino. –

+1

@llonesmiz Sì, real_parser >() | int_ funziona bene anche. –

Problemi correlati