00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef GRAMMAR_TO_PARSERBASIC_SIMPLE_CHOICE_H
00021 #define GRAMMAR_TO_PARSERBASIC_SIMPLE_CHOICE_H
00022
00023 namespace grammar_to_parser {
00024
00025 const char* SIMPLE_CHOICE = "SimpleChoice";
00026
00035 template< typename E >
00036 class basic_simple_choice : public basic_simple_non_terminal<E>
00037 {
00038 public:
00039 typedef typename basic_parser<E>::parser_list parser_list;
00040 typedef typename basic_parser<E>::parser_list_iterator parser_list_iterator;
00041
00042 basic_simple_choice() : basic_simple_non_terminal<E>()
00043 {
00044 set_name(SIMPLE_CHOICE);
00045 };
00046
00047 unsigned long parse( const E* buf, const unsigned long buf_length )
00048 {
00049 prepare_for_parsing();
00050 parser_list_iterator it = m_parser_list.begin();
00051
00052 m_is_parsed = false;
00053 while( it != m_parser_list.end() && !m_is_parsed )
00054 {
00055 (*it)->parse( buf + m_parsed_size, buf_length - m_parsed_size );
00056 if( (*it)->is_parsed() )
00057 {
00058 m_is_parsed = true;
00059 m_parsed_size += (*it)->parsed_size();
00060 }
00061 it++;
00062 }
00063
00064 while( it != m_parser_list.end() )
00065 {
00066 (*it)->invalidate();
00067 }
00068 return m_parsed_size;
00069 }
00070 virtual std::basic_istream<E>& parse( std::basic_istream<E>& is )
00071 {
00072 prepare_for_parsing();
00073 parser_list_iterator it = m_parser_list.begin();
00074 std::streampos pos = is.tellg();
00075
00076 m_is_parsed = false;
00077 while( it != m_parser_list.end() && !m_is_parsed )
00078 {
00079 (*it)->parse( is );
00080 if( (*it)->is_parsed() )
00081 {
00082 m_is_parsed = true;
00083 m_parsed_size += (*it)->parsed_size();
00084 }
00085 it++;
00086 }
00087
00088 while( it != m_parser_list.end() )
00089 {
00090 (*it++)->invalidate();
00091 }
00092
00093 if( !m_is_parsed )
00094 {
00095 is.clear();
00096 is.seekg( pos );
00097 }
00098 return is;
00099 }
00100 };
00101
00102
00103 typedef basic_simple_choice<char> simple_choice;
00104 typedef basic_simple_choice<wchar_t> wsimple_choice;
00105
00106 };
00107
00108 #endif