0

MIPS 구문을 검사하는 C# 응용 프로그램을 디버깅하려고합니다. 하지만 디버깅을 허용하지 않습니다. Main() 함수의 첫 번째 행을 포함하여 어디에서 중단 점을 입력해도 무시됩니다. 그것도 나 에게이 오류를 던지고. 내가 HasValidParams() 를 호출하지 않는 경우 'ABC를 추가는'잘 작동 HasValidParams를 호출 할 때 같은 상황 에서 예외가 발생하지 둘 다 작동하는 'AB 추가'()처리되지 않은 예외, 디버그 할 수 없습니다.

enter image description here

program.cs

private static void Main(string[] args) 
     { 
      var validator = new MipsValidator(); 
      Console.Write("Please enter a MIPS statement: "); 
      string input = Console.ReadLine(); 
      List<string> arguments = input.Split(new char[0]).ToList(); 
      Response status = validator.IsSyntaxValid(arguments); 
      //Check syntax 
      if (status.Success.Equals(true)) 
      { 
       Response stat = validator.HasValidParams(arguments); 
       //Check parameters 
       if (stat.Success.Equals(true)) 
       { 
       Console.WriteLine(string.Format("'{0}' is a valid mips instruction ", input)); 
       } 
       else 
       { 
        foreach (var reason in stat.Reasons) 
        { 
         Console.WriteLine(reason); 
        } 
       } 
      } 
      else 
      { 
       foreach (string reason in status.Reasons) 
       { 
        Console.WriteLine(reason); 
       } 
      } 
     } 

MIPS-validator.cs

using System; 
using System.Collections.Generic; 
using System.Text.RegularExpressions; 

namespace mips_validator.utils 
{ 
    public class MipsValidator : IMipsValidator 
    { 
     #region Implementation of IMipsValidator 

     public Response IsSyntaxValid(List<string> args) 
     { 
      var response = new Response {Success = true}; 
      var op = (Operator) Enum.Parse(typeof (Operator), args[0]); 
      switch (op) 
      { 
       case Operator.addi: 
       case Operator.add: 
       case Operator.beq: 
        if (args.Count != 4) 
        { 
         response.Reasons.Add(string.Format("4 operands required for {0}, {1} parameters provided.", 
                  op, args.Count)); 
         response.Success = false; 
        } 
        break; 
       case Operator.j: 
        if (args.Count != 2) 
        { 
         response.Reasons.Add(string.Format("1 operands required for {1}, {0} parameters provided.", 
                  args.Count, op)); 
         response.Success = false; 
        } 
        break; 
       default: 
        response.Reasons.Add(string.Format("{0} is an unknown mips operation", op)); 
        response.Success = false; 
        break; 
      } 
      return response; 
     } 

     public Response HasValidParams(List<string> parameters) 
     { 
      string op1, op2, op3; 
      var temporary = new Regex(@"/\$t\d+/"); 
      var store = new Regex(@"/\$s\d+/"); 
      var zero = new Regex(@"/\$zero/"); 
      var osReserved = new Regex(@"/\$k0|1/"); 
      var memory = new Regex(@""); 
      var constant = new Regex(@"/-?\d*/"); 
      var label = new Regex(@"/.*\:/"); 
      Operator operation; 
      var response = new Response {Success = true}; 
      string opString = parameters[0]; 
      Enum.TryParse(opString.Replace("$", string.Empty), true, out operation); 
      switch (operation) 
      { 
       case Operator.add: 
        { 
         op1 = parameters[1]; 
         op2 = parameters[2]; 
         if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1)) 
         { 
          response.Reasons.Add(string.Format("{0}: error register expected", op1)); 
          response.Success = false; 
         } 
         if (!temporary.IsMatch(op2) && !store.IsMatch(op2) && !zero.IsMatch(op2)) 
         { 
          response.Reasons.Add(string.Format("{0}: error register expected", op2)); 
          response.Success = false; 
         } 
        } 
        break; 
       case Operator.addi: 
        { 
         op1 = parameters[1]; 
         op2 = parameters[2]; 
         if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1)) 
         { 
          response.Reasons.Add(string.Format("{0}: error register expected", op1)); 
          response.Success = false; 
         } 
         if (!constant.IsMatch(op2) && !zero.IsMatch(op2)) 
         { 
          response.Reasons.Add(string.Format("{0}: error constant expected", op2)); 
          response.Success = false; 
         } 
        } 
        break; 
       case Operator.beq: 
        { 
         op1 = parameters[1]; 
         op2 = parameters[2]; 
         op3 = parameters[3]; 
         if (!temporary.IsMatch(op1) && !store.IsMatch(op1) && !zero.IsMatch(op1)) 
         { 
          response.Reasons.Add(string.Format("{0}: error register expected", op1)); 
          response.Success = false; 
         } 
         if (!temporary.IsMatch(op2) && !store.IsMatch(op2) && !zero.IsMatch(op2)) 
         { 
          response.Reasons.Add(string.Format("{0}: error register expected", op2)); 
          response.Success = false; 
         } 
         if (!label.IsMatch(op3) && !constant.IsMatch(op3)) 
         { 
          response.Reasons.Add(string.Format("{0}: error label or constant expected", op3)); 
          response.Success = false; 
         } 
        } 
        break; 
      } 

      return response; 
     } 

     #endregion 
    } 
} 

SOLUTION ------- 01,235,164

public class Response 
    { 
     public Response() 
     { 
      Reasons = new List<string>(); 
      Success = true; 
     } 
     public List<string> Reasons; 
     public bool Success = true; 

    } 
+0

디버깅 문제는 확실하지 않지만, 예외 사항을 만들 때 응답 개체를 만들 때 이유가 초기화됩니까? – Mike

+0

@Mike 아니, 그것을 지적 해 주셔서 감사하지 않았다. 그것을 생성자에 추가했습니다. –

답변

3

나는 경우 말할 수 없다 ...이 도움이

enter image description here

희망 : 물론 프로젝트가 제대로 구축되어 있는지 확인하고 현재 구성을 확인 (오른쪽 "다시"솔루션을 클릭하고 선택) 프로젝트를 디버그 할 수있는 방법을 찾고 있거나 코드에서 잠재적 인 문제를 듣고 싶다면. 후자의 경우

:

Response.ReasonsResponse의 생성자 (또는 필드 이니셜 라이저)에 의해 초기화되어 있는지 확인합니다.

1

확인 (구)

public class Response 
{ 
    public List<string> Reasons; 
    public bool Success = true; 

} 

Response.cs (현재)Response.cs 중단 점은 다음과 같습니다 경우 :

enter image description here

만약 그렇다면

, 소스를 코드는 어셈블리가 실제로 컴파일 된 코드와 다릅니다.

2

응답 클래스가 표시되지 않으므로 Reasons가 실제로 추가 할 수있는 컬렉션으로 설정되어 있고 기본값 인 null로 설정되지 않았는지 확인하십시오.

편집 : @nodakai에 의해 충돌이 발생할 가능성이있는 원인을 지적했습니다. 공백 문자 배열은 공백으로 분리하는 특별한 경우입니다.

* 목록 인수 = input.Split (new char [0]). ToList(); 내가 말할 수있는 한은 절대적으로 아무 것도하지 않는다. 목록 안에 원래의 문자열을 넣는 것을 제외하고. 공백으로 나누는 대신 new char[] {' '}으로 분할하는 것이 좋습니다. *

+0

_separator_ 매개 변수가 null 참조 (Visual Basic의 경우 아무 것도 **)이거나 문자가없는 경우 공백 문자가 구분 기호로 간주됩니다. http://msdn.microsoft.com/en-us/library/b873y76a(v=vs.80).aspx – nodakai

+0

@nodakai 저도 몰랐습니다. 감사! –