2012-03-09 55 views
1

我試圖創建一個方法,它根據正則表達式檢查一個字符串並返回一個寄存器類型(mips)。問題是,我似乎無法創建正確的正則表達式。 請看看並提出建議。由於正則表達式解析器的問題

public static RegisterType CheckRegex(this string source) 
     { 
      var tempMatch = new Regex("$t0|$t1|$t2|$t3|$t4|$t5|$t6|$t7|$t8|$t9|").Match(source); //$t0 - $t9 
      if(tempMatch.Length == source.Length) 
       return RegisterType.Temporary; 
      var storeMatch = new Regex(@"(^\$s)+[0-9]").Match(source); //$s0 - $s9 
      if (storeMatch.Length == source.Length) 
       return RegisterType.Store; 
      var reservedMatch = new Regex(@"").Match(source);   //$k0 - $k1 
      if (reservedMatch.Length == source.Length) 
       return RegisterType.OSReserved; 
      var constantMatch = new Regex(@"0-9").Match(source);  //Any integer 
      if (constantMatch.Length == source.Length) 
       return RegisterType.Constant; 
      var memoryMatch = new Regex("").Match(source); 
      if (memoryMatch.Length == source.Length) 
       return RegisterType.Memory; 

      return RegisterType.Invalid; 
     } 

UPDATE:現在一切工作正常,但不包括我的記憶正則表達式

public static RegisterType GetRegisterType(this string source) 
     { 
      if (Regex.IsMatch(source, @"\$t[0-9]")) 
       return RegisterType.Temporary; // $t0 - $t9 
      if (Regex.IsMatch(source, @"\$s[0-9]")) 
       return RegisterType.Store; // $s0 - $s9 
      if (Regex.IsMatch(source, @"\$k[0-1]")) 
       return RegisterType.OSReserved; // $k0 - $k1 
      if (Regex.IsMatch(source, @"[-+]?\b\d+\b")) 
       return RegisterType.Constant; 
      if (Regex.IsMatch(source, @"\$zero")) 
       return RegisterType.Special; 
      if (Regex.IsMatch(source, @"[a-zA-Z0-9]+\b\:")) 
       return RegisterType.Label; 
      if (Regex.IsMatch(source, @"\d+\b\(\$[s-t]\b[0-9])")) 
       return RegisterType.Memory; 
      return RegisterType.Invalid; 

     } 
+1

什麼部分回事?你在哪裏不匹配。注意,我相信你需要在臨時寄存器匹配表達式 – pstrjds 2012-03-09 18:15:07

+0

中轉義'$'我還有一個問題(因爲我寫MIPS彙編已經有多年了),你的源代碼是一個完整的指令嗎?您的匹配k個寄存器的表達式是空白的?你的匹配「記憶」表達式也是一個空白的正則表達式。你可以給一些'source'的例子嗎? – pstrjds 2012-03-09 18:23:11

+0

@pstrjds參考內存例如:lw $ t7,248($ t2) – 2012-03-09 19:46:55

回答

3

正如其他人所說的,您需要在"$t0|$t1|$t2|$t3|$t4|$t5|$t6|$t7|$t8|$t9|"之前加上反斜槓以避開美元符號。此外,您可以更簡潔地編寫爲@"\$t[0-9]"。這將匹配一個美元符號,然後是't'後跟一個數字。你有一個尾隨的管道字符,後面什麼也沒有,可以刪除。

+1

實際上,末尾的'|'*必須被移除。有了它,正則表達式可以合法地匹配任何東西,就好像你用圓括號包裝了它並添加了「?」量詞。這意味着第一次測試總是會成功,其他測試都不會執行。您的簡潔版本還可以糾正該錯誤。 – 2012-03-09 23:18:10

3

$是在正則表達式特殊字符,在該行的末尾匹配。如果您想匹配$文字,請使用轉義(\$)

1

如果您source只是一個註冊/存儲位置,你也許可以簡化這個東西到是這樣的:

public static RegisterType CheckRegex(this string source) 
{ 
    if (Regex.IsMatch(@"\$\t\d")) return RegisterType.Temporary; // $t0 - $t9 
    if (Regex.IsMatch(@"\$\s\d")) return RegisterType.Store; // $s0 - $s9 
    if (Regex.IsMatch(@"\$\k\[0-1]")) return RegisterType.OSReserved; // $k0 - $k1 
    if (Regex.IsMatch(source, @"\d")) return RegisterType.Constant; 
    // Don't remember the pattern for Memory, if you post an update I can update this 

    return RegisterType.Invalid; 
}