1

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

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

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

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

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

4

2 回答 2

1

您正在寻找的正则表达式如下:

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

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

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

请注意,这destjump每个部分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,你会得到:

dest = 'M'
comp = 'D'
jump = None
于 2020-11-10T13:18:29.567 回答
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

请参阅此处的示例:https ://regex101.com/r/v8t4Ma/1

于 2016-10-02T14:01:26.450 回答