正则表达式捕捉汇编程序 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
您要查找的正则表达式如下:
(?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-Instruction
的 dest
和 jump
部分是可选的。
它们仅分别以后缀 =
和前缀 ;
出现。
因此,您必须注意这些迹象:
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
我正在学习 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
您要查找的正则表达式如下:
(?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-Instruction
的 dest
和 jump
部分是可选的。
它们仅分别以后缀 =
和前缀 ;
出现。
因此,您必须注意这些迹象:
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