From d03a02d3e5ade46c73a40084c7fc6d9631d2b988 Mon Sep 17 00:00:00 2001 From: Charles Baker Date: Mon, 29 May 2023 21:19:24 +1200 Subject: [PATCH] Use correct string for lexeme when debugging parsers This works for UTF-8 encoded strings but debugging will fail when using UTF-16 or UTF-32 as the printf() formatted string won't deal with null characters embedded within the wider character encodings. Committing this for now because it doesn't break any existing functionality but does enable parsing of wider character inputs. --- src/lalr/Parser.ipp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lalr/Parser.ipp b/src/lalr/Parser.ipp index 30f5670..dad237c 100644 --- a/src/lalr/Parser.ipp +++ b/src/lalr/Parser.ipp @@ -494,7 +494,7 @@ void Parser::debug_shift( const Par if ( debug_enabled_ ) { const ParserSymbol* symbol = node.symbol(); - const std::string& lexeme = node.lexeme(); + const std::basic_string& lexeme = node.lexeme(); int line = node.line(); int column = node.column(); fire_printf( "SHIFT: (%s %s %d:%d)\n", symbol ? symbol->identifier : "", lexeme.c_str(), line, column ); @@ -521,14 +521,14 @@ void Parser::debug_reduce( const Pa if ( debug_enabled_ ) { - fire_printf( "REDUCE: %s <- ", reduced_symbol->identifier ); + fire_printf( "REDUCE: %s <- ", reduced_symbol->identifier ); const ParserNode* node = nodes_.data() + start; const ParserNode* node_end = nodes_.data() + finish; if ( node != node_end ) { const ParserSymbol* symbol = node->symbol(); - const std::string& lexeme = node->lexeme(); + const std::basic_string& lexeme = node->lexeme(); int line = node->line(); int column = node->column(); fire_printf( "(%s %s %d:%d)", symbol ? symbol->identifier : "", lexeme.c_str(), line, column ); @@ -538,7 +538,7 @@ void Parser::debug_reduce( const Pa while ( node != node_end ) { const ParserSymbol* symbol = node->symbol(); - const std::string& lexeme = node->lexeme(); + const std::basic_string& lexeme = node->lexeme(); int line = node->line(); int column = node->column(); fire_printf( " (%s %s %d:%d)", symbol ? symbol->identifier : "", lexeme.c_str(), line, column );