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.
This commit is contained in:
parent
749ee73406
commit
7a2f2d91aa
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user