Click here to Skip to main content
15,884,628 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
C++
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
}}

Above code worked fine with strings but when i try to parse wide strings though i do not get any compilation errors , but the code fails to do conversions from roman to int and vice versa . I know + ch_p(p) only accepts characters or strings not wide strings .... how do i set rule that i set scannerT parsers wide strings and wchar_t const * are parsed ....

C++
<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;
}
Posted
Updated 11-Mar-15 1:01am
v2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month


CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900