boost::spirit utilisation des arguments
Bonsoir,
A la découverte de boost::spirit je me suis dit qu'un outil comme celui là ne pourrait qu'accélérer le développement de mes parsers. Mais je n'arrive pas à faire ce dont j'ai besoin. A terme je voudrais faire un parsers de fonction ( C-like ) que je pourrait appeler dans mon code. Les fonctions étant entrées dynamiquement... Bref je n'en suis pas encore là !
Je voudrais simplement appeler une fonction voici mon parser issus d'un exemple que j'essaye d'upgrader :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| typedef std::string::const_iterator Iterator;
typedef float TYPE;
struct Calculator :
boost::spirit::qi::grammar< Iterator, TYPE() >
{
Calculator() :
Calculator::base_type( expr )
{
using boost::spirit::qi::word;
using boost::spirit::qi::float_;
using boost::spirit::qi::_1;
using boost::spirit::qi::_val;
expr =
term [ _val = _1 ]
>> *( '+' >> term [ _val += _1 ]
| '-' >> term [ _val -= _1 ]
);
term =
factor [ _val = _1 ]
>> *( '*' >> factor [ _val *= _1 ]
| '/' >> factor [ _val /= _1 ]
| '^' >> factor [ _val = Math::Pow( _val, _1 ) ]
);
factor =
float_ [ _val = _1 ]
//| func_call
| '(' >> expr [ _val = _1 ] >> ')'
| '-' >> factor [ _val -= _1 ]
| '+' >> factor [ _val = _1 ]
;
/*func_call =
word [ m_sFunctionName = _1() ]
>> '(' >> -( expr [ m_oParams.push( _1 ) ]
>> *( ',' >> expr [ m_oParams.push( _1 ) ] ) ) >> ')';*/
}
boost::spirit::qi::rule< Iterator, TYPE() > expr, term, factor/*, func_call*/;
private:
//std::stack< boost::phoenix::actor< boost::spirit::argument< 0 > > > m_oParams;
//std::string m_sFunctionName;
};
// Dans mon Main :
Calculator oCalc;
float32 fResult;
Iterator oBegin = sInput.begin();
Iterator oEnd = sInput.end();
bool bRet = parse( oBegin, oEnd, oCalc, fResult );
if ( bRet )
{
cout << sInput << " = " << fResult << endl;
} |
Le problème vient de la ligne qui contient Math::Pow(). En effet je ne peux pas faire cela puisque mon Pow prend soit un float, soit un double ou soit un long double. _val est de type : boost::phoenix::actor< boost::spirit::argument< 0 > >. J'ai essayé d'évalué la lambda expression avec l'opérateur (). Mais rien n'y fait je n'arrive toujours pas à retrouver la valeur.
Voilà mon problème. Les opérateurs de base on été surchargées pour les lambdas (+, -, <<, ...). Mais comment faire pour récupérer les valeurs de mes arguments, pour les utiliser avec des types de base du C++ ?