首页 > 解决方案 > 如何使用正则表达式匹配 asm 文件中的标签和指令

问题描述

我正在尝试使用正则表达式从 python 中的 asm 文件中提取标签和包含的指令。

汇编代码,

.data
    numOne: .word 10

    numTwo: 
        .word 20
.text
.globl main
main:
    lw $s1  , 0($s0)
    lw $s2, 4($s0)
    add $s3, $s1, $s2
    lw $s2,numOne
    jr $ra
foo:
    add $s3, $s1, $s2
    jr $ra

在这种情况下,标签是“main”和“foo”,然后是每个标签中的说明

这是我定义的标签的模式,

label_pattern = re.compile(
    r"(\w+:)(\s*\w{2,3}\s*(\$[a-z0-9]{2}\s*,?\s*){1,3}(\d+\(\$[a-z][0-9]\))*)+\n?")

我无法lw $s2,numOne使用此模式在 asm 文件中匹配(第 12 行)。输出如下,

main:
    lw $s1  , 0($s0)
    lw $s2, 4($s0)
    add $s3, $s1, $s2
    lw $s2,
foo:
    add $s3, $s1, $s2
    jr $ra

我尝试修改正则表达式以匹配单词,

label_pattern = re.compile(
    r"(\w+:)(\s*\w{2,3}\s*(\$[a-z0-9]{2}\s*,?\s*){1,3}(\d+\(\$[a-z][0-9]\))*\w*)+\n?")

但我没有得到我想要的结果。

main:
    lw $s1  , 0($s0)
    lw $s2, 4($s0)
    add $s3, $s1, $s2
    lw
foo:
    add $s3, $s1, $s2
    jr

请纠正我。谢谢你。

编辑:为了澄清,我试图将指令存储在字典中,其中标签作为键,指令列表作为值。

这是我用来检查输出的代码

import re

label_pattern = re.compile(
    r"(\w+:)(\s*\w{2,3}\s*(\$[a-z0-9]{2}\s*,?\s*){1,3}(\d+\(\$[a-z][0-9]\))*\w*)+\n?")

test_pattern = re.compile(
    r"\s*\w{2}\s*\$[a-z][0-9]\s*,\s*(\d+\(\$[a-z][0-9]\))*\w+\s*"
) # this pattern matches the instruction lw $s2, numOne

f = open("instructionTest.asm", "r") # instructionTest.asm refers to the above asm code
matches = label_pattern.finditer(f.read())

for match in matches:
    if match:
        print(match.group())

我期待以下输出,其中包含标签和其中包含的说明。

main:
    lw $s1  , 0($s0) 
    lw $s2, 4($s0)   
    add $s3, $s1, $s2
    lw $s2,numOne
    jr $ra
foo:
    add $s3, $s1, $s2
    jr $ra

编辑 2:请求重新打开此问题以获得可能更好的解决方案

标签: pythonregexassembly

解决方案


您没有得到预期的输出,因为除了空格和其他空白字符之外的匹配项,因此\s在输入之后使用换行符,并且以下内容与下一行的指令匹配,从而干扰了进一步的匹配。 如果我们用 替换这些序列,我们会得到预期的输出:\t\n(\$[a-z0-9]{2}\s*,?\s*)add $s3, $s1, $s2\w*label_patternlw
\s[ \t]

r"(\w+:)(\s*\w{2,3}\s*(\$[a-z0-9]{2}[ \t]*,?[ \t]*){1,3}(\d+\(\$[a-z][0-9]\))*\w*)+\n?")

推荐阅读