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

时间:2016-10-02 07:57:31

标签: regex nand2tetris

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

我正在尝试编写一个正则表达式以使一切变得更容易 - 我希望能够在给定的行上编译表达式,并且只需通过组号,知道我使用的表达式的哪一部分。例如,对于表达式:A=M+1;JMP我想获得group(1) = Agroup(2) = Mgroup(3) = JMP

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

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

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

2 个答案:

答案 0 :(得分:1)

您要查找的RegEx如下:

(?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指令。

请注意,每个dest的{​​{1}}和jump部分是可选的。
它们仅分别带有后缀C-Instruction和前缀=

因此,您必须注意以下这些标志:

;

最后,您将获得所需的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

答案 1 :(得分:0)

不太确定你想做什么,但根据你的例子,你可以像这样做一个正则表达式:

([\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

请参阅此处的示例:vlcj