Added DirectiveClass with comment iterator

This commit is contained in:
stefan.desouza@outlook.com
2023-08-06 17:42:42 +02:00
parent 71e2931bb0
commit 9a0474bcc1
2 changed files with 48 additions and 17 deletions

View File

@@ -86,6 +86,43 @@ class InstructionForm:
def comment(self, comment):
self._COMMENT_ID =comment
class DirectiveForm:
def __init__(self, NAME_ID = None, PARAMETER_ID = None, COMMENT_ID = None):
self._NAME_ID = NAME_ID
self._PARAMETER_ID = PARAMETER_ID
self._COMMENT_ID = COMMENT_ID
@property
def name(self):
return self._NAME_ID
@property
def parameters(self):
return self._PARAMETER_ID
@property
def comment(self):
return self._COMMENT_ID
def __iter__(self):
return self
def __next__(self):
if not self._COMMENT_ID:
raise StopIteration
return self._COMMENT_ID.pop(0)
@name.setter
def name(self, name):
self._NAME_ID = name
@parameters.setter
def parameters(self, parameters):
self._PARAMETER_ID = parameters
@comment.setter
def comment(self, comment):
self._COMMENT_ID = comment
class ParserX86ATT(BaseParser):
_instance = None
@@ -307,13 +344,13 @@ class ParserX86ATT(BaseParser):
self.directive.parseString(line, parseAll=True).asDict()
)
instruction_form.directive = {
"name": result[self.DIRECTIVE_ID]["name"],
"parameters": result[self.DIRECTIVE_ID]["parameters"],
"name": result.directive.name,
"parameters": result.directive.parameters,
}
if self.COMMENT_ID in result[self.DIRECTIVE_ID]:
if self.COMMENT_ID in result.directive:
instruction_form.comment = " ".join(
result[self.DIRECTIVE_ID][self.COMMENT_ID]
result.directive.comment
)
except pp.ParseException:
pass
@@ -379,12 +416,12 @@ class ParserX86ATT(BaseParser):
return operand
def process_directive(self, directive):
directive_new = {"name": directive["name"], "parameters": []}
directive_new = DirectiveForm(NAME_ID = directive["name"], PARAMETER_ID = [])
if "parameters" in directive:
directive_new["parameters"] = directive["parameters"]
directive_new.parameters = directive["parameters"]
if "comment" in directive:
directive_new["comment"] = directive["comment"]
return AttrDict({self.DIRECTIVE_ID: directive_new})
directive_new.comment = directive["comment"]
return InstructionForm(DIRECTIVE_ID = directive_new)
def process_memory_address(self, memory_address):
"""Post-process memory address operand"""

View File

@@ -82,22 +82,16 @@ class TestParserX86ATT(unittest.TestCase):
self._get_directive(self.parser, "\t.align\t16,0x90").parameters[1], "0x90"
)
self.assertEqual(
self._get_directive(self.parser, " .byte 100,103,144 #IACA START")[
"name"
],
self._get_directive(self.parser, " .byte 100,103,144 #IACA START").name,
"byte",
)
self.assertEqual(
self._get_directive(self.parser, " .byte 100,103,144 #IACA START")[
"parameters"
][2],
self._get_directive(self.parser, " .byte 100,103,144 #IACA START").parameters[2],
"144",
)
self.assertEqual(
" ".join(
self._get_directive(self.parser, " .byte 100,103,144 #IACA START")[
"comment"
]
self._get_directive(self.parser, " .byte 100,103,144 #IACA START").comment
),
"IACA START",
)