00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef BRACKET_EXPRESSIONSINGLE_EXPRESSION_H
00021 #define BRACKET_EXPRESSIONSINGLE_EXPRESSION_H
00022
00023 namespace bracket_expression {
00024
00025 template<typename E>
00026 class single_expression
00027 {
00028 typedef typename grammar_to_parser::basic_parser<E>::parser_list parser_list;
00029
00030 grammar_to_parser::basic_choice<E,collating_choice<E> >
00031 m_collating_choice;
00032 grammar_to_parser::basic_non_terminal<E,character_class<E> >
00033 m_character_class;
00034 grammar_to_parser::basic_choice<E,equivalence_class<E> >
00035 m_equivalence_class;
00036
00037 public:
00038 unsigned long recognize( const E* buf, const unsigned long buf_length )
00039 {
00040 int ret = 0;
00041 int size = 0;
00042 if( m_collating_choice.is_parsed() )
00043 {
00044 ret = m_collating_choice->compare(buf,buf_length);
00045 size = m_collating_choice->matched_size();
00046 }
00047 else if( m_character_class.is_parsed() )
00048 {
00049 ret = m_character_class->compare(buf,buf_length);
00050 size = m_character_class->matched_size();
00051 }
00052 else
00053 {
00054 ret = m_equivalence_class->compare(buf,buf_length);
00055 size = m_equivalence_class->matched_size();
00056 }
00057 if( ret == 0 )
00058 return size;
00059 else
00060 return 0;
00061 }
00062 public:
00063 single_expression() {};
00064
00065 ~single_expression() {};
00066 void push_parsers( parser_list &l )
00067 {
00068 l.push_back( &m_equivalence_class );
00069 l.push_back( &m_character_class );
00070 l.push_back( &m_collating_choice );
00071 }
00072
00073 };
00074
00075 };
00076
00077 #endif