aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/python/libstdcxx
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-01-05 11:16:06 +0000
committerJonathan Wakely <jwakely@redhat.com>2022-01-05 13:47:02 +0000
commit7a2f2d91aa6d18b0ab4194f9eb94262016a09803 (patch)
tree5e0b5fb86de1973b9618389aed017af5a85dc15d /libstdc++-v3/python/libstdcxx
parent749ee73406d31c7104c64bb7bf84780dea187d48 (diff)
downloadgcc-7a2f2d91aa6d18b0ab4194f9eb94262016a09803.zip
gcc-7a2f2d91aa6d18b0ab4194f9eb94262016a09803.tar.gz
gcc-7a2f2d91aa6d18b0ab4194f9eb94262016a09803.tar.bz2
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.
Diffstat (limited to 'libstdc++-v3/python/libstdcxx')
-rw-r--r--libstdc++-v3/python/libstdcxx/v6/printers.py32
1 files changed, 32 insertions, 0 deletions
diff --git a/libstdc++-v3/python/libstdcxx/v6/printers.py b/libstdc++-v3/python/libstdcxx/v6/printers.py
index 84a5469..44f1148 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.