こんにちは、スピリットライブラリをブーストするのは非常に新しいです。以下のコードがコンパイルされない理由を教えてください。
「scientificNumber」ルールを文法に追加すると、コンパイルされません。その理由は何ですか?「12E10」のような科学表記法を解析できるように、「scientificNumber」ルールを追加しました。これが正しい方法であったかどうかはわかりません。
namespace qi = boost::spirit::qi;
namespace phx = boost::phoenix;
typedef boost::function<double()> Value;
#define BINARY_FUNCTOR(name, op) \
struct name \
{ \
name(Value x, Value y): x_(x), y_(y) {} \
double operator()() { return x_() op y_(); } \
Value x_, y_; \
};
BINARY_FUNCTOR(ADD, +)
BINARY_FUNCTOR(SUB, -)
BINARY_FUNCTOR(MUL, *)
BINARY_FUNCTOR(DIV, /)
struct LIT
{
LIT(double x): x_(x) {}
double operator()() { return x_; }
double x_;
};
struct NEG
{
NEG(Value x): x_(x) {}
double operator()() { return -x_(); }
Value x_;
};
struct SQRT
{
SQRT(Value x): x_(x){}
double operator()() {return sqrt(x_()); }
Value x_;
};
struct SCIENTIFIC
{
SCIENTIFIC(std::wstring x): x_(x){}
double operator()() {return boost::lexical_cast<double>(x_); }
std::wstring x_;
};
// expression grammar definition
template <typename It, typename Skipper=boost::spirit::qi::space_type>
struct parser : boost::spirit::qi::grammar<It, Value(), Skipper>
{
parser() : parser::base_type(expression)
{
using namespace qi;
expression =
term [_val = _1]
>> *( ('+' >> term [_val = phx::construct<ADD>(_val, _1)])
| ('-' >> term [_val = phx::construct<SUB>(_val, _1)])
);
term =
factor [_val = _1]
>> *( ('*' >> factor [_val = phx::construct<MUL>(_val, _1)])
| ('/' >> factor [_val = phx::construct<DIV>(_val, _1)])
);
factor =
double_ [_val = phx::construct<LIT>(_1)]
| scientificNumber [_val = phx::construct<SCIENTIFIC>(_1)]
| '(' >> expression [_val = _1] >> ')'
| ('-' >> factor [_val = phx::construct<NEG>(_1)])
| ('+' >> factor [_val = _1])
| (string("SQRT") >> '(' >> expression [_val = phx::construct<SQRT>(_1)] >> ')');
scientificNumber = lexeme[+(boost::spirit::qi::digit) >> lit('E') >> lit('-') >> +(boost::spirit::qi::digit)];
BOOST_SPIRIT_DEBUG_NODE(expression);
BOOST_SPIRIT_DEBUG_NODE(term);
BOOST_SPIRIT_DEBUG_NODE(factor);
}
private:
boost::spirit::qi::rule<It, std::wstring , Skipper> scientificNumber;
qi::rule<It, Value(), Skipper> expression, term, factor;
};
int main()
{
std::wstring::const_iterator beginExpression(testExp.begin());
std::wstring::const_iterator endExpression(testExp.end());
typedef std::wstring::const_iterator It;
parser<It , boost::spirit::qi::space_type> expressionParser;
Value logicExpression;
phrase_parse(beginExpression,endExpression,expressionParser,boost::spirit::qi::space,logicExpression);
}
また、boost::spirit::qi::grammarとは何か教えてください