struct add_1000 { add_1000(unsigned& r_) : r(r_) {} void operator()(wchar_t) const { r += 1000; } unsigned& r; }; struct add_roman { add_roman(unsigned& r_) : r(r_) {} void operator()(unsigned n) const { r += n; } unsigned& r; }; /////////////////////////////////////////////////////////////////////////////// // // roman (numerals) grammar // /////////////////////////////////////////////////////////////////////////////// struct roman : public grammar<roman> { template <typename scannert=""> struct definition { definition(roman const& self) { first = +ch_p(L'M') [add_1000(self.r)] || hundreds_p [add_roman(self.r)] || tens_p [add_roman(self.r)] || ones_p [add_roman(self.r)]; // Note the use of the || operator. The expression // a || b reads match a or b and in sequence. Try // defining the roman numerals grammar in YACC or // PCCTS. Spirit rules! :-) } rule<scannert> first; rule<scannert> const& start() const { return first; } }; roman(unsigned& r_) : r(r_) {} unsigned& r; }; BOOST_SPIRIT_CLASSIC_NAMESPACE_END }}
<pre lang="cs">int RomanNumeralConversion:: RomanToInt(const std::wstring& romanNumeral) { std::wstring upperRoman(romanNumeral); FDStringUtils::ToUpper(upperRoman.begin(), upperRoman.end()); unsigned int result = 0; BOOST_SPIRIT_CLASSIC_NS::roman roman_p(result); if (parse(upperRoman.c_str(), roman_p).full) return result; return -1; }
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)