正则表达式捕捉汇编程序 C 命令

regex to catch assembler C-command

我正在学习 Nand-2-Tetris 课程。我们被要求编写和汇编程序。 C 命令的类型为 dest=comp;jump,其中每个部分都是可选的。

我试图编写一个正则表达式来使一切变得更简单 - 我希望能够在给定的行上编译表达式,并且仅通过组号就可以知道我正在使用表达式的哪一部分。例如,对于表达式:A=M+1;JMP I want to get group(1) = A, group(2) = M and group(3) = JMP.

我的问题是每个部分都是可选的,所以我不知道如何编写这个正则表达式。到目前为止我想出了:

(A?M?D?)\s=([^;\s]*)\s?(?=;[\s]*([a-zA-Z]{1,4})|$)

这适用于大多数情况,但并不像我预期的那样有效。例如,缺少 comp 将不起作用 (D;JGT)。我已经尝试过积极的前瞻,但它没有用。

不太确定你想做什么,但根据你的示例,你可以创建如下正则表达式:

([\w]+)[=]?([\w])*[+-]*[\w]*;([\w]+)

然后对于该行:

A=M+1;JMP

您将获得以下内容:

Full match  A=M+1;JMP
Group 1     A
Group 2     M
Group 3     JMP

对于那一行:

D;JGT

您将获得:

Full match  D;JGT
Group 1     D
Group 3     JGT

参见此处示例:https://regex101.com/r/v8t4Ma/1

您要查找的正则表达式如下:

(?P<dest>[AMD]{1,3}=)?(?P<comp>[01\-AMD!|+&><]{1,3})(?P<jump>;[JGTEQELNMP]{3})?

让我们把它分解成几个部分:

  • (?P<dest>[AMD]{1,3}=)? - 将搜索可选的 destination 以将计算结果存储在其中。
  • (?P<comp>[01\-AMD!|+&><]{1,3}) - 将搜索 computation 指令。
  • (?P<jump>;[JGTEQELNMP]{3})? - 将搜索可选的 jump 指令。

请注意,每个 C-Instructiondestjump 部分是可选的。
它们仅分别以后缀 = 和前缀 ; 出现。

因此,您必须注意这些迹象:

if dest is not None:
    dest = dest.rstrip("=")

if jump is not None:
    jump = jump.lstrip(";")

最终得到想要的C-Instrucion解析:

对于行 A=A+M;JMP 你将得到:

dest = 'A'
comp = 'A+M'
jump = 'JMP'

对于行 D;JGT 你将得到:

dest = None
comp = 'D'
jump = 'JGT'

对于行 M=D 你会得到:

dest = 'M'
comp = 'D'
jump = None