2016-10-02 22 views
1

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

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

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

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

这适用于大多数情况下,但它不工作,因为我期望它。例如,缺乏补偿将不起作用(D;JGT)。我试过积极的向前看,但它没有奏效。

+0

汇编器是_parser_,虽然正则表达式可以肯定是你使用一个工具,它不是唯一的问题。 –

+2

同意。这看起来像是“如果你只有一把锤子,每个问题看起来像钉子”。正则表达式是一个强大的工具,但是将它用于这类任务需要耗费你的时间和任何需要阅读代码的人。 – MadOverlord

回答

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

+0

这还不够好。我还需要能够编写'A = M + 1',它应该可以工作。另外,我还需要支持!M(否定)-M等操作。这就是为什么在我的正则表达式中,我没有指定哪些字符是预先准备好的,我只是确保我记录了一些我不喜欢的东西'不想('[^; \ s]') –