2012-03-12 3 views
2

Я пытаюсь выполнить синтаксический анализ инструкций. Я хочу использовать регулярное выражение для проверки каждой подстроки. Как я могу убедиться, что строка заканчивается запятой? Мое регулярное выражение для памяти (mips) также не работает.Регулярное выражение, должно заканчиваться запятой

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

     } 

пример того, как загрузить из памяти

lw $t7,248($t2) 
+0

Зачем вам Regex? source.EndsWith (",") будет делать то, что вы хотите, и красиво и читаемо. –

+0

Мне нужно убедиться, что вся строка соответствует форме. т.е. временный => $ t0 - $ t9 –

+0

. Попробуйте объяснить, что вы подразумеваете под * Как я могу убедиться, что строка заканчивается запятой? * в качестве примера 'lw $ t7,248 ($ t2)' не имеет запятой в конце. – Borodin

ответ

2

Я не уверен, что вы имеете в виду о строке заканчивающийся запятой. Насколько я могу судить, вы можете просто написать @"\$t[0-9],".

Ваше регулярное выражение не совпадает, так как у вас есть [s-t]\b[0-9]. Поскольку s и t и от 0 до 9 являются всеми символами слова, между ними не может быть границы слова. Также у вас есть неоткрываемая закрывающая скобка. Это будет @"\d+\(\$[st][0-9]\)".

Если список операндов просто разделяются запятыми, а затем разбить строку на запятых и проверить каждый один

string command = "$t7,248($t2)"; 

string [] operands = command.Split(new Char [] {','}); 

и ваши регулярные выражения должны быть закреплены в начале и в конце, как этот

if (Regex.IsMatch(source, @"^\$t[0-9]$")) 
    return OperandType.Temporary; 
if (Regex.IsMatch(source, @"^\$s[0-9]$")) 
    return OperandType.Store; 

и так далее.

+0

Спасибо, что первый не работает, но он имеет регулярное выражение. Я решил проверить, заканчивается ли это запятой перед тестированием регулярного выражения. Это облегчит исключение последнего параметра. благодаря –

1

Это выражение может работать:

, $

+0

не работает. try @ "\ $ t [0-9], $" не уверен, что то, что означало u –

+0

Попробуйте выйти из запятой. "\ $ t [0-9] \, $" –

+1

Запятая не является метасимволом регулярного выражения и не нуждается в экранировании. Я думаю, проблема заключается в том, что запятая не находится в конце строки. – Borodin

Смежные вопросы