From 071273032ec490f1a6ac25c5062cbc72e48105f4 Mon Sep 17 00:00:00 2001 From: Charles Baker Date: Sat, 3 Jun 2023 11:37:13 +1200 Subject: [PATCH] Update XML example to parser from UTF-8 to UTF-8 in memory --- src/lalr/lalr_examples/lalr_xml_example.cpp | 37 +++++++++++---------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/lalr/lalr_examples/lalr_xml_example.cpp b/src/lalr/lalr_examples/lalr_xml_example.cpp index 5def603..6512426 100644 --- a/src/lalr/lalr_examples/lalr_xml_example.cpp +++ b/src/lalr/lalr_examples/lalr_xml_example.cpp @@ -4,6 +4,7 @@ #include #include #include +#include using namespace std; using namespace lalr; @@ -11,21 +12,23 @@ using namespace lalr; namespace { +typedef std::basic_string String; + struct Attribute { - std::string name_; - std::string value_; + String name_; + String value_; - Attribute( const std::string& name, const std::string& value ) - : name_( name ), - value_( value ) + Attribute( const String& name, const String& value ) + : name_( name ) + , value_( value ) { } }; struct Element { - std::string name_; + String name_; std::list > attributes_; std::list > elements_; @@ -61,7 +64,7 @@ struct XmlUserData } }; -static XmlUserData document( const XmlUserData* start, const ParserNode* nodes, size_t length ) +static XmlUserData document( const XmlUserData* start, const ParserNode* nodes, size_t length ) { const XmlUserData* end = start + length; while ( start != end && !start[0].element_ ) @@ -71,28 +74,28 @@ static XmlUserData document( const XmlUserData* start, const ParserNode* n return start != end ? start[0] : XmlUserData(); } -static XmlUserData add_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) +static XmlUserData add_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) { shared_ptr element = start[0].element_; element->elements_.push_back( start[1].element_ ); return XmlUserData( element ); } -static XmlUserData create_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) +static XmlUserData create_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) { shared_ptr element( new Element() ); element->elements_.push_back( start[0].element_ ); return XmlUserData( element ); } -static XmlUserData short_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) +static XmlUserData short_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) { shared_ptr element = start[2].element_; element->name_ = nodes[1].lexeme(); return XmlUserData( element ); } -static XmlUserData long_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) +static XmlUserData long_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) { shared_ptr element = start[2].element_; if ( !element ) @@ -108,7 +111,7 @@ static XmlUserData long_element( const XmlUserData* start, const ParserNode* nodes, size_t length ) +static XmlUserData add_attribute( const XmlUserData* start, const ParserNode* nodes, size_t length ) { LALR_ASSERT( start[0].element_ ); shared_ptr element = start[0].element_; @@ -117,7 +120,7 @@ static XmlUserData add_attribute( const XmlUserData* start, const ParserNode* nodes, size_t length ) +static XmlUserData create_attribute( const XmlUserData* start, const ParserNode* nodes, size_t length ) { LALR_ASSERT( start[0].attribute_ ); shared_ptr element( new Element() ); @@ -125,7 +128,7 @@ static XmlUserData create_attribute( const XmlUserData* start, const ParserNode< return XmlUserData( element ); } -static XmlUserData attribute( const XmlUserData* start, const ParserNode* nodes, size_t length ) +static XmlUserData attribute( const XmlUserData* start, const ParserNode* nodes, size_t length ) { shared_ptr attribute( new Attribute(nodes[0].lexeme(), nodes[2].lexeme()) ); return XmlUserData( attribute ); @@ -166,9 +169,9 @@ static void print( const Element* element, int level ) void lalr_xml_example() { extern const lalr::ParserStateMachine* xml_parser_state_machine; - Parser parser( xml_parser_state_machine ); + Parser parser( xml_parser_state_machine ); parser.lexer_action_handlers() - ( "string", &string_literal ) + ( "string", &string_literal ) ; parser.parser_action_handlers() ( "document", &document ) @@ -190,7 +193,7 @@ void lalr_xml_example() " " ; - parser.parse( input, input + strlen(input) ); + parser.parse( (const uint8_t*) input, (const uint8_t*) input + strlen(input) ); LALR_ASSERT( parser.accepted() ); LALR_ASSERT( parser.full() ); print( parser.user_data().element_.get(), 0 );