0

MIPS構文をチェックするC#アプリケーションをデバッグしようとしています。しかし、それをデバッグすることはできません。ブレークポイントをどこに入力しても、Main()関数の最初の行を含めて無視されます。それも私にこのエラーを投げます。 )同じ状況 に例外をスローしないどちらもHasValidParamsを呼び出すとき(働く 'ABを追加')私はHasValidParams(呼び出していない場合は正常に動作します 'ABCを追加'未処理の例外、デバッグできません

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 ------- Response.cs

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

} 

(旧)Response.cs(現在の)

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

あなたのブレークポイントは、次のようになりますかどうかを確認します。それがない場合は

enter image description here

、あなたのソースコードはアセンブリが実際にコンパイルされたコードとは異なります。これがあれば、私が言うことができない...

2

あなたはResponseクラスを表示していないので、Reasonsが実際に追加できるコレクションに設定されていて、デフォルトでnullになっていないことを確認してください。

編集:@ nodakaiによって引き起こされるクラッシュの可能性のある原因は、1つではないことを指摘しました。空のchar配列は、空白で分割する特殊なケースです。

*引数を計算するには、 を実行します。リスト引数= input.Split(new char [0])。ToList(); 私が知る限りでは絶対に何もないリストの中に元の文字列を入れてください。 *

+0

_separator_パラメータがnull参照(Visual Basicでは** Nothing **)または文字を含まない場合、空白文字が区切り文字とみなされます。 http://msdn.microsoft.com/en-us/library/b873y76a(v=vs.80).aspx – nodakai

+0

@nodakaiわたしは知らなかった。ありがとう! –