我参加了Nand-2-Tetris课程。我们被要求编写和汇编。 C命令的类型为dest=comp;jump
,其中每个部分都是可选的。
我正在尝试编写一个正则表达式以使一切变得更容易 - 我希望能够在给定的行上编译表达式,并且只需通过组号,知道我使用的表达式的哪一部分。例如,对于表达式:A=M+1;JMP
我想获得group(1) = A
,group(2) = M
和group(3) = JMP
。
我的问题是每个部分都是可选的,所以我不知道如何编写这个正则表达式。到目前为止,我提出了:
(A?M?D?)\s=([^;\s]*)\s?(?=;[\s]*([a-zA-Z]{1,4})|$)
这适用于大多数情况,但它并不像我预期的那样有效。例如,缺乏comp会工作(D;JGT
)。我尝试了积极的前瞻,但它没有工作。
答案 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