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 :
Le problème vient de la ligne qui contient Math:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }ow(). 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++ ?
Partager