parser_traits.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 475 行 · 第 1/2 页
HPP
475 行
return token_rule_assign; } return token_rule_ref; 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: boost::throw_exception(regex_error(error_badbrace, "unrecognized extension")); } case BOOST_XPR_CHAR_(char_type, 'P'): this->eat_ws_(++begin, end); detail::ensure(begin != end, error_paren, "incomplete extension"); switch(*begin) { case BOOST_XPR_CHAR_(char_type, '<'): this->get_name_(++begin, end, name); detail::ensure(begin != end && BOOST_XPR_CHAR_(char_type, '>') == *begin++, error_paren, "incomplete extension"); return token_named_mark; case BOOST_XPR_CHAR_(char_type, '='): this->get_name_(++begin, end, name); detail::ensure(begin != end, error_paren, "incomplete extension"); return token_named_mark_ref; default: boost::throw_exception(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: boost::throw_exception(regex_error(error_badbrace, "unrecognized extension")); } } return token_literal; } ////////////////////////////////////////////////////////////////////////// // get_charset_token // NOTE: white-space is *never* ignored in a charset. template<typename FwdIter> regex_constants::compiler_token_type get_charset_token(FwdIter &begin, FwdIter 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, '['): { FwdIter next = begin; ++next; if(next != end) { detail::ensure( *next != BOOST_XPR_CHAR_(char_type, '=') , error_collate , "equivalence classes are not yet supported" ); detail::ensure( *next != BOOST_XPR_CHAR_(char_type, '.') , error_collate , "collation sequences are not yet supported" ); if(*next == BOOST_XPR_CHAR_(char_type, ':')) { begin = ++next; return token_posix_charset_begin; } } } break; case BOOST_XPR_CHAR_(char_type, ':'): { FwdIter 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 template<typename FwdIter> regex_constants::compiler_token_type get_escape_token(FwdIter &begin, FwdIter 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_ template<typename FwdIter> regex_constants::compiler_token_type parse_mods_(FwdIter &begin, FwdIter 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: boost::throw_exception(regex_error(error_paren, "unknown pattern modifier")); } while(detail::ensure(++begin != end, error_paren, "incomplete extension")); // this return is technically unreachable, but this must // be here to work around a bug in gcc 4.0 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 0 != this->space_ && this->traits().isctype(ch, this->space_); } /////////////////////////////////////////////////////////////////////////// // is_alnum_ bool is_alnum_(char_type ch) const { return 0 != this->alnum_ && this->traits().isctype(ch, this->alnum_); } /////////////////////////////////////////////////////////////////////////// // get_name_ template<typename FwdIter> void get_name_(FwdIter &begin, FwdIter end, string_type &name) { this->eat_ws_(begin, end); for(name.clear(); begin != end && this->is_alnum_(*begin); ++begin) { name.push_back(*begin); } this->eat_ws_(begin, end); detail::ensure(!name.empty(), regex_constants::error_paren, "incomplete extension"); } /////////////////////////////////////////////////////////////////////////////// // eat_ws_ template<typename FwdIter> FwdIter &eat_ws_(FwdIter &begin, FwdIter 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_; typename regex_traits::char_class_type alnum_;};}} // namespace boost::xpressive#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?