Is it possible to re-use boost::spirit::qi grammar in another grammar definition?
Date : March 29 2020, 07:55 AM
Hope that helps Of course you can. In your case, just put address_grammar address_; in your code. Let me show you another example. You can find a compilable code here: http://ideone.com/GW4jO (see also below)#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
struct Date {
int year, month, day;
};
struct Time {
int hour, minute, second;
};
BOOST_FUSION_ADAPT_STRUCT(
Date,
(int, year)
(int, month)
(int, day)
)
BOOST_FUSION_ADAPT_STRUCT(
Time,
(int, hour)
(int, minute)
(int, second)
)
namespace qi = boost::spirit::qi;
namespace ascii = boost::spirit::ascii;
typedef std::string::const_iterator Iterator;
class DateParser:
public qi::grammar < Iterator, Date() > {
qi::rule < Iterator, Date() > main;
public:
DateParser(): base_type(main) {
main %= qi::int_ >> '-' >> // Year
qi::int_ >> '-' >> // Month
qi::int_; // Day
}
};
class TimeParser:
public qi::grammar < Iterator, Time() > {
qi::rule < Iterator, Time() > main;
public:
TimeParser(): base_type(main) {
main %= qi::int_ >> ':' >> // Hour
qi::int_ >> ':' >> // Minute
qi::int_; // Second
}
};
class DateTimeParser:
public qi::grammar < Iterator, boost::variant<Date, Time>() > {
qi::rule < Iterator, boost::variant<Date, Time>()> main;
public:
DateTimeParser(): base_type(main) {
main %= date_parser | time_parser;
}
DateParser date_parser;
TimeParser time_parser;
};
#include<iostream>
#include<cstdio>
struct Printer : public boost::static_visitor<> {
void operator()(Date a) const {
printf("Year: %d, Month: %d, Day: %d\n", a.year, a.month, a.day);
}
void operator()(Time a) const {
printf("Hour: %d, Minute: %d, Second: %d\n", a.hour, a.minute, a.second);
}
};
int main() {
std::string s;
std::getline(std::cin, s);
Iterator beg = s.begin(), end = s.end();
boost::variant<Date, Time> ret;
phrase_parse(beg, end, DateTimeParser(), ascii::space, ret);
if (beg != end)
puts("Parse failed.");
else
boost::apply_visitor(Printer(), ret);
}
|
function definition in BNF C grammar
Date : March 29 2020, 07:55 AM
hop of those help? Yes, in that grammar is the name of the object being declared, plus its arguments or array size (and also the pointer qualifiers of its type). does not include the base type (return type for a function; element type for an array).
|
Grammar fails unexpectedly boost::spirit grammar definition
Tag : cpp , By : WellBeing
Date : March 29 2020, 07:55 AM
I wish did fix the issue. Your skipper eats spaces, so "def " and " enddef" will never match. See also Boost spirit skipper issues#include <string>
#include <vector>
#define BOOST_SPIRIT_UNICODE
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/qi_alternative.hpp>
namespace overmath {
using namespace std;
namespace qi = boost::spirit::qi;
using namespace boost::spirit::unicode;
struct identifier { wstring name; } ;
struct function { identifier name; } ;
struct program { vector<function> functions; } ;
}
BOOST_FUSION_ADAPT_STRUCT(overmath::identifier, (std::wstring, name))
BOOST_FUSION_ADAPT_STRUCT(overmath::function, (overmath::identifier, name))
BOOST_FUSION_ADAPT_STRUCT(overmath::program, (std::vector<overmath::function>, functions))
namespace overmath {
using namespace boost::spirit::unicode;
namespace qi = boost::spirit::qi;
using boost::spirit::lit;
template <typename Iterator> struct function_parser : qi::grammar<Iterator, program(), space_type> {
function_parser() : function_parser::base_type(program) {
identifier = qi::eps >> +alnum;
function = "def" >> identifier >> '(' >> ')' >> "enddef";
program = qi::eps >> +function;
}
qi::rule<Iterator, identifier()> identifier;
qi::rule<Iterator, function(), space_type> function;
qi::rule<Iterator, program(), space_type> program;
};
template <typename Iterator> wstring parse(Iterator first, Iterator last) {
using boost::spirit::qi::phrase_parse;
program f;
function_parser<Iterator> fp;
auto b = phrase_parse(first, last, fp, space, f);
if (b) {
return wstring(L"OK");
}
return wstring(L"FAIL");
}
}
int main() {
std::wstring const s = L"def abc() enddef";
std::wcout << overmath::parse(s.begin(), s.end());
}
|
CFG grammar definition
Date : March 29 2020, 07:55 AM
|
python grammar: wrong atom definition?
Date : March 29 2020, 07:55 AM
wish of those help to juanpa's comment and the answers in the related question, it appears that the problem comes from 10.. The definition of NUMBER includes the dot such that 10.bit_length() is of kind NUMBER NAME trailer and not NUMBER '.' NAME trailer. In order to obtain an atom_expr, one must separate the dot: both 10 .bit_length() and (10).bit_length() give the correct answer.
|