コンパイラ用のコード行の形式で文字列を取り込む関数を記述し、スペースまたはセミコロンで終わる文字列を入力するたびに(コードの各行は私の言語で書かれています) 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
パーサを作成する場合は、パーサージェネレータツールキット(GOLD Parser、ANTLRなど)の使用を検討してください。 – Lucero
readCharを呼び出すコードを表示できますか? – sr28
はい、できます。講師が与えたテンプレートのこのコードを使用して、私がネットワーキング分野で働いていたときに数年間プログラミングをしていなかったので、私が今やっているコースでは、私たちを深いところに投げ込み、コンパイラを開発してほしい私たち自身のプログラミング言語のために。私は、構文解析ジェネレータツールキットの使用はコースに許可されないと思います。いくつかの呼び出しコードで編集されます。 – Rokudo