Regex 正则表达式捕获汇编程序C命令
我正在上Nand-2俄罗斯方块课程。我们被要求编写和汇编程序。C命令的类型为Regex 正则表达式捕获汇编程序C命令,regex,nand2tetris,Regex,Nand2tetris,我正在上Nand-2俄罗斯方块课程。我们被要求编写和汇编程序。C命令的类型为dest=comp;跳转,其中每个部分都是可选的 我试图编写一个正则表达式,使一切变得更简单-我希望能够在给定的行上编译表达式,只需通过组号,就可以知道我使用的是表达式的哪一部分。例如,对于表达式:A=M+1;JMP我想得到组(1)=A,组(2)=M和组(3)=JMP 我的问题是每个部分都是可选的,所以我不知道如何编写这个正则表达式。到目前为止,我提出了: (A?M?D?)\s=([^;\s]*)\s?(?=;[\s]*
dest=comp;跳转
,其中每个部分都是可选的
我试图编写一个正则表达式,使一切变得更简单-我希望能够在给定的行上编译表达式,只需通过组号,就可以知道我使用的是表达式的哪一部分。例如,对于表达式:A=M+1;JMP
我想得到组(1)=A
,组(2)=M
和组(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
D;JGT
您将获得以下信息:
Full match A=M+1;JMP
Group 1 A
Group 2 M
Group 3 JMP
对于这一行:
A=M+1;JMP
D;JGT
您将获得:
Full match D;JGT
Group 1 D
Group 3 JGT
请参见此处的示例:您正在查找的正则表达式如下所示:
(?P[AMD]{1,3}=)?(?P[01 \-AMD!|+&>汇编程序是一个解析器,虽然正则表达式可能是您使用的工具,但它不是唯一的关注点。同意。这看起来像是“如果您只有一把锤子,那么每个问题都像钉子”.Regex是一个功能强大的工具,但是使用它来完成这类任务需要花费您和任何需要阅读您的代码的人的时间。这仍然不够好。我还需要能够编写a=M+1
,并且应该可以工作。此外,我还需要支持诸如!M(否定)之类的操作-M等。这就是为什么在我的正则表达式中,我没有指定哪些字符是comp的前置字符,我只是确保我捕获了我不想捕获的内容([^;\s]
)