Skip to content
Snippets Groups Projects
Commit 70463e3c authored by pompolic's avatar pompolic
Browse files

WIP commit

parent ddec58fa
No related branches found
No related tags found
No related merge requests found
......@@ -78,9 +78,25 @@ class HParserEnv:
# parser_array = [top_level_parse.add_or_get_parser(gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) +"]")) for index in range(0, num_parsers)]
# compare pointers for equality
# TODO: consistent naming for member_parser, member_parser_pointers,
class AttrBoolEnv(HParserEnv):
def __init__(self, parser, top_level_parse):
self.parser = parser
member_parser_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->p")
self.member_parser = top_level_parse.add_or_get_parser(member_parser_p)
self.predicate_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->pred")
self.user_data_p = gdb.parse_and_eval("((HAttrBool *) parser->env)->user_data")
def __str__(self):
return str(self.member_parser)
class BitsEnv(HParserEnv):
class SequenceEnv(HParserEnv):
def __init__(self, parser, top_level_parse):
super().__init__(parser, top_level_parse)
super().__init__(parser, top_level_parse) # TODO: maybe move self.parser to base class. otherwise, is this needed?
self.parser = parser
self.member_parsers = []
......@@ -158,6 +174,31 @@ class ChEnv(HParserEnv):
def __str__(self):
return str(self.ch_value)
class ChoiceEnv(HParserEnv):
def __init__(self, parser, top_level_parse):
super().__init__(parser, top_level_parse)
self.parser = parser
self.member_parsers = []
#frame = gdb.selected_frame()
h_sequence_p = gdb.parse_and_eval("(HSequence*) parser->env")
num_parsers = gdb.parse_and_eval("((HSequence *) parser->env)->len")
# TODO: should GDB do the array indexing operation, or should the Python code?
# TODO: top_level_parse.create_or_get_parser(address)
#[gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]") for index in range(0, num_parsers)]
# TODO: maybe the loop can be replaced with a list comprehension
#[top_level_parse.add_or_get_parser(gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) +"]")) for index in range(0, num_parsers)]
for index in range(0, num_parsers):
parser_p = gdb.parse_and_eval("((HSequence*) parser->env)->p_array[" + str(index) + "]")
parser_obj = top_level_parse.add_or_get_parser(parser_p)
if parser_obj.name is None:
parser_obj.name_parser( self.name_from_vtable(parser_obj) )
self.member_parsers.append(parser_obj)
def __str__(self):
return str([str(parser) for parser in self.member_parsers])
class ManyEnv(HParserEnv):
def __init__(self, parser, top_level_parse):
......@@ -172,14 +213,50 @@ class ManyEnv(HParserEnv):
def __str__(self):
return "P: " + str(self.p) + ", sep: " + str(self.separator) + ", count: " + str(self.count)
class NotEnv(HParserEnv):
def __init__(self, parser, top_level_parse):
self.parser = parser
member_p = gdb.parse_and_eval("(HParser*) parser->env")
member_obj = top_level_parse.add_or_get_parser(member_p)
self.member_parser = member_obj
def __str__(self):
return str(self.member_parser)
class NothingEnv(HParserEnv):
def __init__(self, parser, top_level_parse):
self.parser = parser
def __str__(self):
return "[]"
class OptionalEnv(HParserEnv):
def __init__(self, parser, top_level_parse):
self.parser = parser
member_p = gdb.parse_and_eval("(HParser*) parser->env")
member_obj = top_level_parse.add_or_get_parser(member_p)
self.member_parser = member_obj
def __str__(self):
return str(self.member_parser)
vtable_to_env = {
'sequence_vt': SequenceEnv,
'ignore_vt': IgnoreEnv,
'action_vt': ActionEnv,
'and_vt': AndEnv,
'attr_bool_vt': AttrBoolEnv,
'ch_vt': ChEnv,
'many_vt': ManyEnv
'many_vt': ManyEnv,
'not_vt': NotEnv,
'nothing_vt': NothingEnv,
'optional_vt': OptionalEnv
}
# When given a Parser object, decompose_parser() deduces its type from the vtable, and returns the appropriate HParserEnv subclass, containing member parsers and args
# Not sure what to name it. Alternatives:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment