Re: newbie here ask about qi::_val and semantic action
Henri Menke <[email protected]> Mon, 9 Jul 2018 19:03:40 +1200
| Newsgroups | gmane.comp.parsers.spirit.general |
|---|---|
| Message-ID | <[email protected]> |
On 09/07/18 17:38, Yi Leong wrote:
> yeah, in the qi::double_[qi::_val = qi::_1] , the semantic action is a
> lambda expression, but as the following:
>
> #include <iostream>
> #include <string>
>
> #include <boost/spirit/include/phoenix.hpp>
> #include <boost/spirit/include/qi.hpp>
>
> void print_action(double f)
> {
> qi::_val = qi::_1; // it does not work....
> }
>
print_action already has a callable type, so you can use it in the
semantic action without placeholders.
The placeholders are useful if you have a oneline semantic action for
which you don't want to write an extra callable. See the docs for details:
https://www.boost.org/libs/spirit/doc/html/spirit/qi/tutorials/semantic_actions.html
#include <iostream>
#include <string>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/qi.hpp>
double print_action(double f)
{
std::cout << "Attribute value: " << f << "\n";
return f;
}
int main() {
std::string s = "1234.56789";
double d;
std::string::iterator first = s.begin();
std::string::iterator last = s.end();
namespace qi = boost::spirit::qi;
bool r = qi::phrase_parse(first, last, qi::double_ [&print_action],
qi::space, d);
if (!r || first != last) {
std::cerr << "Error while parsing. Rest: " <<
std::string(first, last) << "\n";
}
std::cout << "Success! " << d << "\n";
}
> int main() {
> std::string s = "1234.56789";
> double d;
>
> std::string::iterator first = s.begin();
> std::string::iterator last = s.end();
>
> namespace qi = boost::spirit::qi;
> bool r = qi::phrase_parse(first, last, qi::double_ [&print_action],
> qi::space, d);
>
> if (!r || first != last) {
> std::cerr << "Error while parsing. Rest: " <<
> std::string(first, last) << "\n";
> }
> std::cout << "Success! " << d << "\n";
>
> }
>
> The above code gets compiling error, so is the placeholder qi::_val
> usable only in the lambda expression, right?
>
> On Mon, Jul 9, 2018 at 10:06 AM, Henri Menke <[email protected]
> <mailto:[email protected]>> wrote:
>
> Elaborate. The following works.
>
> #include <iostream>
> #include <string>
>
> #include <boost/spirit/include/phoenix.hpp>
> #include <boost/spirit/include/qi.hpp>
>
> int main() {
> std::string s = "1234.56789";
> double d;
>
> std::string::iterator first = s.begin();
> std::string::iterator last = s.end();
>
> namespace qi = boost::spirit::qi;
> bool r = qi::phrase_parse(first, last, qi::double_ [qi::_val =
> qi::_1], qi::space, d);
>
> if (!r || first != last) {
> std::cerr << "Error while parsing. Rest: " <<
> std::string(first, last) << "\n";
> }
> std::cout << "Success! " << d << "\n";
>
> }
>
>
> On 09/07/18 03:40, Yi Leong wrote:
>
> Hi,
> I set qi::_val in semantic action function , but it does not work.
> Is the placeholder _val only usable in lambda expression?
>
>
>
>
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>
>
>
> _______________________________________________
> Spirit-general mailing list
> [email protected]
> <mailto:[email protected]>
> https://lists.sourceforge.net/lists/listinfo/spirit-general
> <https://lists.sourceforge.net/lists/listinfo/spirit-general>
>
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Spirit-general mailing list
> [email protected]
> <mailto:[email protected]>
> https://lists.sourceforge.net/lists/listinfo/spirit-general
> <https://lists.sourceforge.net/lists/listinfo/spirit-general>
>
>
>
>
> ------------------------------------------------------------------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
>
>
>
> _______________________________________________
> Spirit-general mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/spirit-general
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Spirit-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spirit-general