From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2181) id 122BC385800A; Wed, 5 Jan 2022 13:48:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 122BC385800A MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Wakely To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r12-6263] libstdc++: Add pretty printer for std::regex internals X-Act-Checkin: gcc X-Git-Author: Jonathan Wakely X-Git-Refname: refs/heads/master X-Git-Oldrev: 749ee73406d31c7104c64bb7bf84780dea187d48 X-Git-Newrev: 7a2f2d91aa6d18b0ab4194f9eb94262016a09803 Message-Id: <20220105134804.122BC385800A@sourceware.org> Date: Wed, 5 Jan 2022 13:48:04 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 05 Jan 2022 13:48:04 -0000 https://gcc.gnu.org/g:7a2f2d91aa6d18b0ab4194f9eb94262016a09803 commit r12-6263-g7a2f2d91aa6d18b0ab4194f9eb94262016a09803 Author: Jonathan Wakely Date: Wed Jan 5 11:16:06 2022 +0000 libstdc++: Add pretty printer for std::regex internals This helps visualize the NFA states in a std::regex. It probably isn't very useful for users, but helps when working on the implementation. libstdc++-v3/ChangeLog: * python/libstdcxx/v6/printers.py (StdRegexStatePrinter): New printer for std::regex NFA states. Diff: --- libstdc++-v3/python/libstdcxx/v6/printers.py | 32 ++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py index 84a54698c17..44f1148d5ab 100644 --- a/libstdc++-v3/python/libstdcxx/v6/printers.py +++ b/libstdc++-v3/python/libstdcxx/v6/printers.py @@ -1554,6 +1554,34 @@ class StdErrorCodePrinter: pass return '%s = {"%s": %s}' % (self.typename, category, strval) +class StdRegexStatePrinter: + "Print a state node in the NFA for a std::regex" + + def __init__ (self, typename, val): + self.val = val + self.typename = typename + + def to_string (self): + opcode = str(self.val['_M_opcode']) + if opcode: + opcode = opcode[25:] + next_id = self.val['_M_next'] + + variants = {'repeat':'alt', 'alternative':'alt', + 'subexpr_begin':'subexpr', 'subexpr_end':'subexpr', + 'line_begin_assertion':None, 'line_end_assertion':None, + 'word_boundary':'neg', 'subexpr_lookahead':'neg', + 'backref':'backref_index', + 'match':None, 'accept':None, + 'dummy':None, 'unknown':None + } + v = variants[opcode] + + s = "opcode={}, next={}".format(opcode, next_id) + if v is not None and self.val['_M_' + v] is not None: + s = "{}, {}={}".format(s, v, self.val['_M_' + v]) + return "{%s}" % (s) + # A "regular expression" printer which conforms to the # "SubPrettyPrinter" protocol from gdb.printing. class RxPrinter(object): @@ -2015,6 +2043,10 @@ def build_libstdcxx_dictionary (): libstdcxx_printer.add_version('std::tr1::', 'unordered_multiset', Tr1UnorderedSetPrinter) + # std::regex components + libstdcxx_printer.add_version('std::__detail::', '_State', + StdRegexStatePrinter) + # These are the C++11 printer registrations for -D_GLIBCXX_DEBUG cases. # The tr1 namespace containers do not have any debug equivalents, # so do not register printers for them.