tokenizer errors
This commit is contained in:
parent
1d2e489c7f
commit
5b1d0b4606
@ -148,9 +148,13 @@ namespace nana
|
|||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
sp_ = _m_eat_whitespace(sp_);
|
sp_ = _m_eat_whitespace(sp_);
|
||||||
auto tk = read();
|
auto tk = read(); // try ??
|
||||||
if (token::number != tk && token::variable != tk && token::repeated != tk)
|
|
||||||
_m_throw_error("invalid array element");
|
if ( token::number != tk
|
||||||
|
&& token::variable != tk
|
||||||
|
&& token::repeated != tk)
|
||||||
|
|
||||||
|
throw error("invalid array element. Expected a number, variable or repaet", *this);
|
||||||
|
|
||||||
if (!repeated)
|
if (!repeated)
|
||||||
{
|
{
|
||||||
@ -176,7 +180,7 @@ namespace nana
|
|||||||
return (repeated ? token::reparray : token::array);
|
return (repeated ? token::reparray : token::array);
|
||||||
|
|
||||||
if (ch != ',')
|
if (ch != ',')
|
||||||
_m_throw_error("invalid array");
|
throw error("invalid array", *this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -194,7 +198,7 @@ namespace nana
|
|||||||
if (token::number == read())
|
if (token::number == read())
|
||||||
parameters_.push_back(number_);
|
parameters_.push_back(number_);
|
||||||
else
|
else
|
||||||
_m_throw_error("invalid parameter.");
|
throw error("invalid parameter. Expected a number", *this);
|
||||||
|
|
||||||
sp_ = _m_eat_whitespace(sp_);
|
sp_ = _m_eat_whitespace(sp_);
|
||||||
char ch = *sp_++;
|
char ch = *sp_++;
|
||||||
@ -203,7 +207,7 @@ namespace nana
|
|||||||
return token::parameters;
|
return token::parameters;
|
||||||
|
|
||||||
if (ch != ',')
|
if (ch != ',')
|
||||||
_m_throw_error("invalid parameter.");
|
throw error("invalid parameter. Expected a ','", *this);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '.': case '-':
|
case '.': case '-':
|
||||||
@ -222,7 +226,7 @@ namespace nana
|
|||||||
return token::number;
|
return token::number;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_m_throw_error("invalid character '" + std::string(1, *sp_) + "'");
|
throw("invalid character '" + std::string(1, *sp_) + "'", *this);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
if ('0' <= *sp_ && *sp_ <= '9')
|
if ('0' <= *sp_ && *sp_ <= '9')
|
||||||
@ -280,14 +284,14 @@ namespace nana
|
|||||||
{
|
{
|
||||||
auto idstr = idstr_;
|
auto idstr = idstr_;
|
||||||
if (token::equal != read())
|
if (token::equal != read())
|
||||||
_m_throw_error("an equal sign is required after '" + idstr + "'");
|
throw error("an equal sign is required after '" + idstr + "'", *this);
|
||||||
|
|
||||||
return ('g' == idstr[0] ? token::grid : token::margin);
|
return ('g' == idstr[0] ? token::grid : token::margin);
|
||||||
}
|
}
|
||||||
else if ("collapse" == idstr_)
|
else if ("collapse" == idstr_)
|
||||||
{
|
{
|
||||||
if (token::parameters != read())
|
if (token::parameters != read())
|
||||||
_m_throw_error("a parameter list is required after 'collapse'");
|
throw error("a parameter list is required after 'collapse'", *this);
|
||||||
return token::collapse;
|
return token::collapse;
|
||||||
}
|
}
|
||||||
else if (!idstr_.empty())
|
else if (!idstr_.empty())
|
||||||
@ -344,22 +348,14 @@ namespace nana
|
|||||||
return token::identifier;
|
return token::identifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string err = "an invalid character '";
|
throw("invalid character '" + std::string(1, *sp_) + "'", *this);
|
||||||
err += *sp_;
|
|
||||||
err += "'";
|
|
||||||
_m_throw_error(err);
|
|
||||||
return token::error; //Useless, just for syntax correction.
|
return token::error; //Useless, just for syntax correction.
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
void _m_throw_error(const std::string& err)
|
|
||||||
{
|
|
||||||
throw std::runtime_error("nana::place: " + err + " at " + std::to_string(static_cast<unsigned>(sp_ - divstr_)));
|
|
||||||
}
|
|
||||||
|
|
||||||
void _m_attr_number_value()
|
void _m_attr_number_value()
|
||||||
{
|
{
|
||||||
if (token::equal != read())
|
if (token::equal != read())
|
||||||
_m_throw_error("an equal sign is required after '" + idstr_ + "'");
|
throw error("an equal sign is required after '" + idstr_ + "'", *this);
|
||||||
|
|
||||||
auto p = _m_eat_whitespace(sp_);
|
auto p = _m_eat_whitespace(sp_);
|
||||||
|
|
||||||
@ -369,7 +365,7 @@ namespace nana
|
|||||||
|
|
||||||
auto len = _m_number(p, neg_ptr != p);
|
auto len = _m_number(p, neg_ptr != p);
|
||||||
if (0 == len)
|
if (0 == len)
|
||||||
_m_throw_error("the '" + idstr_ + "' requires a number(integer or real or percent)");
|
throw error("the '" + idstr_ + "' requires a number (integer, real or percent)", *this);
|
||||||
|
|
||||||
sp_ += len + (p - sp_);
|
sp_ += len + (p - sp_);
|
||||||
}
|
}
|
||||||
@ -378,7 +374,7 @@ namespace nana
|
|||||||
{
|
{
|
||||||
auto idstr = idstr_;
|
auto idstr = idstr_;
|
||||||
if (token::equal != read())
|
if (token::equal != read())
|
||||||
_m_throw_error("an equal sign is required after '" + idstr + "'");
|
throw error("an equal sign is required after '" + idstr + "'", *this);
|
||||||
|
|
||||||
sp_ = _m_eat_whitespace(sp_);
|
sp_ = _m_eat_whitespace(sp_);
|
||||||
|
|
||||||
@ -396,19 +392,21 @@ namespace nana
|
|||||||
case token::reparray:
|
case token::reparray:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
_m_throw_error("a (repeated) array is required after '" + idstr + "'");
|
throw error("a (repeated) array is required after '" + idstr + "'", *this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char* _m_eat_whitespace(const char* sp) noexcept
|
static const char* _m_eat_whitespace(const char* sp) noexcept
|
||||||
{
|
{
|
||||||
while (*sp && !std::isgraph(*sp))
|
while (*sp && !std::isgraph(int(*sp)))
|
||||||
++sp;
|
++sp;
|
||||||
return sp;
|
return sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t _m_number(const char* sp, bool negative) noexcept
|
std::size_t _m_number(const char* sp, bool negative) noexcept
|
||||||
{
|
{
|
||||||
|
/// \todo use std::from_char<int>() etc.
|
||||||
|
|
||||||
const char* allstart = sp;
|
const char* allstart = sp;
|
||||||
sp = _m_eat_whitespace(sp);
|
sp = _m_eat_whitespace(sp);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user