parser_traits.hpp
来自「support vector clustering for vc++」· HPP 代码 · 共 401 行 · 第 1/2 页
HPP
401 行
spec.greedy_ = true;
if(this->eat_ws_(++begin, end) != end && BOOST_XPR_CHAR_(char_type, '?') == *begin)
{
++begin;
spec.greedy_ = false;
}
return true;
}
///////////////////////////////////////////////////////////////////////////
// get_group_type
regex_constants::compiler_token_type get_group_type(iterator_type &begin, iterator_type end)
{
using namespace regex_constants;
if(this->eat_ws_(begin, end) != end && BOOST_XPR_CHAR_(char_type, '?') == *begin)
{
this->eat_ws_(++begin, end);
detail::ensure(begin != end, error_paren, "incomplete extension");
switch(*begin)
{
case BOOST_XPR_CHAR_(char_type, ':'): ++begin; return token_no_mark;
case BOOST_XPR_CHAR_(char_type, '>'): ++begin; return token_independent_sub_expression;
case BOOST_XPR_CHAR_(char_type, '#'): ++begin; return token_comment;
case BOOST_XPR_CHAR_(char_type, '='): ++begin; return token_positive_lookahead;
case BOOST_XPR_CHAR_(char_type, '!'): ++begin; return token_negative_lookahead;
case BOOST_XPR_CHAR_(char_type, '<'):
this->eat_ws_(++begin, end);
detail::ensure(begin != end, error_paren, "incomplete extension");
switch(*begin)
{
case BOOST_XPR_CHAR_(char_type, '='): ++begin; return token_positive_lookbehind;
case BOOST_XPR_CHAR_(char_type, '!'): ++begin; return token_negative_lookbehind;
default:
throw regex_error(error_badbrace, "unrecognized extension");
}
case BOOST_XPR_CHAR_(char_type, 'i'):
case BOOST_XPR_CHAR_(char_type, 'm'):
case BOOST_XPR_CHAR_(char_type, 's'):
case BOOST_XPR_CHAR_(char_type, 'x'):
case BOOST_XPR_CHAR_(char_type, '-'):
return this->parse_mods_(begin, end);
default:
throw regex_error(error_badbrace, "unrecognized extension");
}
}
return token_literal;
}
//////////////////////////////////////////////////////////////////////////
// get_charset_token
// NOTE: white-space is *never* ignored in a charset.
regex_constants::compiler_token_type get_charset_token(iterator_type &begin, iterator_type end)
{
using namespace regex_constants;
BOOST_ASSERT(begin != end);
switch(*begin)
{
case BOOST_XPR_CHAR_(char_type, '^'): ++begin; return token_charset_invert;
case BOOST_XPR_CHAR_(char_type, '-'): ++begin; return token_charset_hyphen;
case BOOST_XPR_CHAR_(char_type, ']'): ++begin; return token_charset_end;
case BOOST_XPR_CHAR_(char_type, '['):
{
iterator_type next = begin; ++next;
if(next != end && *next == BOOST_XPR_CHAR_(char_type, ':'))
{
begin = ++next;
return token_posix_charset_begin;
}
}
break;
case BOOST_XPR_CHAR_(char_type, ':'):
{
iterator_type next = begin; ++next;
if(next != end && *next == BOOST_XPR_CHAR_(char_type, ']'))
{
begin = ++next;
return token_posix_charset_end;
}
}
break;
case BOOST_XPR_CHAR_(char_type, '\\'):
if(++begin != end)
{
switch(*begin)
{
case BOOST_XPR_CHAR_(char_type, 'b'): ++begin; return token_charset_backspace;
default:;
}
}
return token_escape;
default:;
}
return token_literal;
}
//////////////////////////////////////////////////////////////////////////
// get_escape_token
regex_constants::compiler_token_type get_escape_token(iterator_type &begin, iterator_type end)
{
using namespace regex_constants;
if(begin != end)
{
switch(*begin)
{
//case BOOST_XPR_CHAR_(char_type, 'a'): ++begin; return token_escape_bell;
//case BOOST_XPR_CHAR_(char_type, 'c'): ++begin; return token_escape_control;
//case BOOST_XPR_CHAR_(char_type, 'e'): ++begin; return token_escape_escape;
//case BOOST_XPR_CHAR_(char_type, 'f'): ++begin; return token_escape_formfeed;
//case BOOST_XPR_CHAR_(char_type, 'n'): ++begin; return token_escape_newline;
//case BOOST_XPR_CHAR_(char_type, 't'): ++begin; return token_escape_horizontal_tab;
//case BOOST_XPR_CHAR_(char_type, 'v'): ++begin; return token_escape_vertical_tab;
case BOOST_XPR_CHAR_(char_type, 'A'): ++begin; return token_assert_begin_sequence;
case BOOST_XPR_CHAR_(char_type, 'b'): ++begin; return token_assert_word_boundary;
case BOOST_XPR_CHAR_(char_type, 'B'): ++begin; return token_assert_not_word_boundary;
case BOOST_XPR_CHAR_(char_type, 'E'): ++begin; return token_quote_meta_end;
case BOOST_XPR_CHAR_(char_type, 'Q'): ++begin; return token_quote_meta_begin;
case BOOST_XPR_CHAR_(char_type, 'Z'): ++begin; return token_assert_end_sequence;
// Non-standard extension to ECMAScript syntax
case BOOST_XPR_CHAR_(char_type, '<'): ++begin; return token_assert_word_begin;
case BOOST_XPR_CHAR_(char_type, '>'): ++begin; return token_assert_word_end;
default:; // fall-through
}
}
return token_escape;
}
private:
//////////////////////////////////////////////////////////////////////////
// parse_mods_
regex_constants::compiler_token_type parse_mods_(iterator_type &begin, iterator_type end)
{
using namespace regex_constants;
bool set = true;
do switch(*begin)
{
case BOOST_XPR_CHAR_(char_type, 'i'): this->flag_(set, icase_); break;
case BOOST_XPR_CHAR_(char_type, 'm'): this->flag_(!set, single_line); break;
case BOOST_XPR_CHAR_(char_type, 's'): this->flag_(!set, not_dot_newline); break;
case BOOST_XPR_CHAR_(char_type, 'x'): this->flag_(set, ignore_white_space); break;
case BOOST_XPR_CHAR_(char_type, ':'): ++begin; // fall-through
case BOOST_XPR_CHAR_(char_type, ')'): return token_no_mark;
case BOOST_XPR_CHAR_(char_type, '-'): if(false == (set = !set)) break; // else fall-through
default: throw regex_error(error_paren, "unknown pattern modifier");
}
while(detail::ensure(++begin != end, error_paren, "incomplete extension"));
return token_no_mark;
}
///////////////////////////////////////////////////////////////////////////////
// flag_
void flag_(bool set, regex_constants::syntax_option_type flag)
{
this->flags_ = set ? (this->flags_ | flag) : (this->flags_ & ~flag);
}
///////////////////////////////////////////////////////////////////////////
// is_space_
bool is_space_(char_type ch) const
{
return this->traits().isctype(ch, this->space_);
}
///////////////////////////////////////////////////////////////////////////////
// eat_ws_
iterator_type &eat_ws_(iterator_type &begin, iterator_type end)
{
if(0 != (regex_constants::ignore_white_space & this->flags()))
{
while(end != begin && (BOOST_XPR_CHAR_(char_type, '#') == *begin || this->is_space_(*begin)))
{
if(BOOST_XPR_CHAR_(char_type, '#') == *begin++)
{
while(end != begin && BOOST_XPR_CHAR_(char_type, '\n') != *begin++) {}
}
else
{
for(; end != begin && this->is_space_(*begin); ++begin) {}
}
}
}
return begin;
}
regex_traits traits_;
regex_constants::syntax_option_type flags_;
typename regex_traits::char_class_type space_;
};
}} // namespace boost::xpressive
#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?