diff --git a/osaca/parser/parser_x86att.py b/osaca/parser/parser_x86att.py index b6e42af..f594d0b 100755 --- a/osaca/parser/parser_x86att.py +++ b/osaca/parser/parser_x86att.py @@ -34,8 +34,13 @@ class ParserX86ATT(BaseParser): + pp.Optional(relocation).setResultsName('relocation') ).setResultsName('identifier') # Label + numeric_identifier = pp.Group( + pp.Word(pp.nums).setResultsName('name') + pp.Optional(pp.oneOf('b f', caseless=True)) + ).setResultsName('identifier') self.label = pp.Group( - identifier.setResultsName('name') + pp.Literal(':') + pp.Optional(self.comment) + (identifier | numeric_identifier).setResultsName('name') + + pp.Literal(':') + + pp.Optional(self.comment) ).setResultsName(self.LABEL_ID) # Register: pp.Regex('^%[0-9a-zA-Z]+{}{z},?') self.register = pp.Group( @@ -132,7 +137,7 @@ class ParserX86ATT(BaseParser): pp.alphanums ).setResultsName('mnemonic') # Combine to instruction form - operand_first = pp.Group(self.register ^ immediate ^ memory ^ identifier) + operand_first = pp.Group(self.register ^ immediate ^ memory ^ identifier ^ numeric_identifier) operand_rest = pp.Group(self.register ^ immediate ^ memory) self.instruction_parser = ( mnemonic @@ -305,7 +310,10 @@ class ParserX86ATT(BaseParser): def process_label(self, label): """Post-process label asm line""" # remove duplicated 'name' level due to identifier - label['name'] = label['name']['name'] + if 'name' in label['name'][0]: + label['name'] = label['name'][0]['name'] + else: + label['name'] = label['name'][0] return AttrDict({self.LABEL_ID: label}) def process_immediate(self, immediate):