00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "xrb_arithmeticscanner.hpp"
00012
00013 #include "xrb_util.hpp"
00014
00015 namespace Xrb
00016 {
00017
00018
00019 namespace
00020 {
00021 inline bool IsWhitespace (char c) { return c == ' ' || c == '\t' || c == '\n'; }
00022 inline bool IsOperator (char c) { return c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '(' || c == ')'; }
00023 inline bool IsDecimalDigit (char c) { return c >= '0' && c <= '9'; }
00024 inline Float DecimalDigitValue (char c) { return static_cast<Float>(c - '0'); }
00025 }
00026
00027 ArithmeticScanner::ArithmeticScanner (std::string const &input_string)
00028 :
00029 m_input_string(input_string)
00030 {
00031 m_it = m_input_string.begin();
00032 m_it_end = m_input_string.end();
00033 }
00034
00035 ArithmeticParser::Token::Type ArithmeticScanner::Scan (Float *const scanned_token)
00036 {
00037
00038 while (m_it != m_it_end && IsWhitespace(*m_it))
00039 ++m_it;
00040
00041 if (m_it == m_it_end)
00042 return ArithmeticParser::Token::END_;
00043 else if (IsOperator(*m_it))
00044 return static_cast<ArithmeticParser::Token::Type>(*m_it++);
00045 else if (IsDecimalDigit(*m_it) || *m_it == '.')
00046 {
00047 char const *end = NULL;
00048 *scanned_token = Util::TextToFloat(&*m_it, &end);
00049 ASSERT1(end != NULL);
00050 while (&*m_it != end)
00051 {
00052 ASSERT1(m_it != m_it_end);
00053 ++m_it;
00054 }
00055 return ArithmeticParser::Token::NUMERIC;
00056 }
00057 else
00058 return ArithmeticParser::Token::BAD_TOKEN;
00059 }
00060
00061 }