2016-10-02 104 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]') –