2016-03-30 29 views
-1

コンパイラ用のコード行の形式で文字列を取り込む関数を記述し、スペースまたはセミコロンで終わる文字列を入力するたびに(コードの各行は私の言語で書かれています) 3行目に次のエラー:文字列が ";"で終わるときの部分文字列エラーまたは ""

System.ArgumentOutOfRangeExceptionがインデックスおよび長さは文字列内の場所を参照しなければなりません

未処理でした。

私は最後に ";"または文字列の ""です。例えば、「a = b;」と入力するとa = bの部分を読み込んでシンボルテーブルに置き、区切り文字 "="を認識しますが、 ";"に達するとエラーが表示されます。 "a = b"(セミコロンなし)を入力すると、2番目の ""の後にエラーが表示され、 "b"が読み込まれません。 2行のコード "a = b;"を入力すると"c = 1;" 2行目のコードの後に​​のみエラーが表示されます。 readCharを呼び出す

private static void readChar(
    ref int IX, ref string sentence, ref string testChar, ref int inputType) 
{ 
    testChar = sentence.Substring(IX, 1); 
    IX++; 
    int IX2 = 0; 
    int IX3 = 0; 

    if ("|*/[email protected]#$%^&(),`=".Contains(testChar)) 
    { 
     inputType = 5; 
    } // delimiter 

    else if (Char.IsDigit(testChar, IX2)) 
    { 
     inputType = 3; 
     IX2++; 
    } // numeric   

    else if (Char.IsWhiteSpace(testChar, IX3)) 
    { 
     inputType = 6; 
     IX3++; 
    } // space 

    else if (testChar == ";") 
    { 
     inputType = 7; 
    } // semicolon   
    else 
    { 
     inputType = 1; 
    } // end alpha 
} 

例コード:

switch (inputType) 
      { 
       case 1: // alpha 
        { 
         convertCharToInt(ref inputChar, ref X); 
         wordTotal = wordTotal + X; 
         word = word + inputChar; 
         readChar(ref sentenceIX, ref sentence, ref inputChar, ref inputType); 

         while ((inputType != inputBreakChar) & (inputType != inputDelimeter) & (inputType != inputSemiColon)) //(inputType == 1) 
         { 
          convertCharToInt(ref inputChar, ref X); 
          wordTotal = wordTotal + X; 
          word = word + inputChar; 
          readChar(ref sentenceIX, ref sentence, ref inputChar, ref inputType); 
         } // end while inputType 

         calcSymbolTableIX(ref symbolTable, ref wordTotal, ref R); 
         setSymbolTableIX(ref symbolTable, ref symbolTableName, ref word, ref R); 

         word = ""; 
         break; 
        } // end case 1 
+0

パーサを作成する場合は、パーサージェネレータツールキット(GOLD Parser、ANTLRなど)の使用を検討してください。 – Lucero

+0

readCharを呼び出すコードを表示できますか? – sr28

+0

はい、できます。講師が与えたテンプレートのこのコードを使用して、私がネットワーキング分野で働いていたときに数年間プログラミングをしていなかったので、私が今やっているコースでは、私たちを深いところに投げ込み、コンパイラを開発してほしい私たち自身のプログラミング言語のために。私は、構文解析ジェネレータツールキットの使用はコースに許可されないと思います。いくつかの呼び出しコードで編集されます。 – Rokudo

答えて

2

これはあなたのブレーク条件を表示する必要が

if(IX == sentence.Length - 1) 
    testChar = sentence.Substring(IX); 
else if(IX < sentence.Length - 1) 
    testChar = sentence.Substring(IX, 1); 
+0

これは以前とまったく同じことをするので、これは問題を解決するつもりはありません。 'IX'が'> = sentence.Length'になるとすぐにコードもスローされます。 – Lucero

+0

'IX> = sentence.Length'のときに' testChar'を変更していないので、以前の値( 'ref'としてメソッドに渡されます)が保持されるため、編集がさらに悪化しました。問題はこの呼び出しではなく、ポスターが表示していない間違った/間違った中断状態です。 – Lucero

+0

これは実際に問題を解決しました。ありがとうございます。 – Rokudo

0

によって、文字列の末尾である場合は、チェックを追加することができます。 IXが最後の文字に達すると、その時にもう1人のキャラクターを試してみると、上記の例外が発生します。インデックスは0ベースであるため、あなたのループ(あなたが持っていると仮定します)は、それが大きいときだけでなく、IX == sentence.Lengthとすぐに停止する必要があります。

別にこれを、Char.IsDigitChar.IsWhitespaceにあなたのコールが壊れている、あなたの代わりにIX2またはIX3の2番目の引数として0を渡す必要があります。

関連する問題