Проблема с использованием подстроки - C#
У меня была небольшая проблема в C# с этим кодом:
string msg = words[cp].Substring(words[cp].IndexOf('=') + 2, words[cp].Length - 1);
Мне действительно нужно это исправить, потому что я пытаюсь создать язык программирования.
Вот исключение:
System.ArgumentOutOfRangeException occurred HResult=0x80131502 Message=Index and length must refer to a location within the string. Parameter name: length Source=mscorlib StackTrace: at System.String.Substring(Int32 startIndex, Int32 length) at ConsoleApp1.Program.Main(String[] args) in C:\Users\*\source\repos\WindowsFormsApp1\ConsoleApp1\Program.cs:line 30
Вот мой код:
Lexer lex = new Lexer(); string code = "def string s = hello world\nread key"; int cp = 0; int ts = 0; lex.AddKeyword("def"); lex.AddKeyword("string"); lex.AddKeyword("read"); lex.AddKeyword("key"); string[] words = code.Split('\n'); string[] identifers = new string[] { }; if (words[cp].Substring(0, 3) == "def") { if (words[cp].Substring(4, 6) == "string") { string msg = words[cp].Substring(words[cp].IndexOf('=') + 2, words[cp].Length - 1); if (!words[cp].Contains('=') || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains(".") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("+") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("=") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("-") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("(") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains(")") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("*") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("&") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("^") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("%") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("$") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("#") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("@") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("!") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("~") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("`") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("1") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("2") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("3") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("4") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("5") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("6") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("7") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("8") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("9") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).StartsWith("0") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains(";") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains(":") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("\\") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("/") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("\"") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("'") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains(".") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains(",") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("{") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("}") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("[") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("]") || words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4).Contains("|")) { Console.WriteLine("Syntax error: \nat: \n " + cp + "\n-------------Press any key to continue-------------"); Console.ReadKey(); } Console.WriteLine(msg); identifers[cp] = words[cp].Substring(12, msg.Length - 1 - msg.Length - 1 - 4); cp++; } else if (words[cp].StartsWith("read ")) { if (words[cp].Substring(6) == "key") { Console.WriteLine("-------------Press any key to continue-------------"); Console.ReadKey(); } } }
ЗАПИСКА:
Lexer-это пользовательский класс, созданный только для этой цели, в нем просто есть какой-то простой список<string> и методы для добавления к ним.
Я использую Visual Studio 2017 .NET Framework 4.6 (этот фреймворк поставляется вместе с пакетом)
Что я уже пробовал:
Я перепробовал все, что смог найти, но ничего не работает.