2016-10-02 3 views
1

私はNand-2-Tetrisコースを受講しています。私たちは書いて、アセンブラを求められます。 Cコマンドのタイプはdest=comp;jumpで、各部分はオプションです。アセンブラCコマンドをキャッチする正規表現

私はすべてを簡単にするために正規表現を書こうとしていました。私は与えられた行の式をコンパイルすることができます。グループ番号だけで、私が使っている式の部分を知っています。たとえば、式の場合:A=M+1;JMPgroup(1) = Agroup(2) = Mおよびgroup(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(negate)-Mなどの操作もサポートする必要があります。これは私の正規表現では、どの文字がcompのために前提されているのかを指定しなかったため、したくない( '[^; \ s]') –