internal void Start(string mainName, string mainPath, List <string> mainText) { // Сброс медиа MethodErrorParser.MediaLines = new HashSet <string>(); ImportErrorParser.NewCallPath = mainPath; var program = new Program(mainName, mainPath, mainText, Data.Project.Type); Data.Project.Main = program; // Активация листа описания методов DefaultObjectList.Install(); // Первый проход, парсим INCLUDE IMPORT FOLDER, проверяем скобки FirstFindFiles(mainPath); if (Data.Errors.Count > 0) { return; } // Парсим созданные файлы на целостность структуры ParseStruct(); if (Data.Errors.Count > 0) { return; } // Парсим имена функций, процедур и меток на предмет уникальности ParseNames(); if (Data.Errors.Count > 0) { return; } // Собираем файл Linker.Start(); if (Data.Errors.Count > 0) { return; } }
internal static bool ParseInitVarError(Line line, VariableType type, bool array, int startPos, int endPos, int minimumWords) { bool math = true; bool plus = false; bool addMath = false; string varName = ""; bool badString = false; var firstType = type; VariableType oldType = VariableType.NON; if (line.Words[0].Text.ToLower() != "for") { varName = line.Words[0].Text; } else { varName = line.Words[1].Text; } if (line.Count < minimumWords) // default 3 { Data.Errors.Add(new Errore(line.Number, line.FileName, 1411, "")); return(true); } for (int j = startPos; j < endPos; j++) // default startPos = 2, endPos = line.Count { oldType = type; var word = line.Words[j]; var token = word.Token; if (token == Tokens.MATHOPERATOR) { plus = false; addMath = true; if (word.Text == "+") { plus = true; } if (word.Text == "-") { if (j == 2) { if (line.Count >= 4 && line.Words[3].Token == Tokens.NUMBER) { if (!Data.Project.Variables.ContainsKey(varName)) { //Builder.Project.MainVariables.Add(varName, new Variable() { Init = true, OldName = varName, NewName = varName, Type = VariableType.NUMBER }); if (type == VariableType.NON) { type = VariableType.NUMBER; } else if (type != VariableType.NUMBER) { if (firstType == VariableType.NON) { if (type == VariableType.STRING) { badString = true; type = VariableType.NUMBER; } } if (!badString) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else { var v = Data.Project.Variables[varName]; if (v.Type != VariableType.NUMBER) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } return(false); } } else { Data.Errors.Add(new Errore(line.Number, line.FileName, 1415, "")); return(true); } } else { if (!math) { math = true; } else { if (j + 1 < line.Words.Count && line.Words[j + 1] != null && (line.Words[j + 1].Token == Tokens.NUMBER || line.Words[j + 1].Token == Tokens.VARIABLE || line.Words[j + 1].Token == Tokens.METHOD)) { continue; } else { Data.Errors.Add(new Errore(line.Number, line.FileName, 1409, "( " + word.Text + " )")); return(true); } } } } else { if (!math) { math = true; } else { Data.Errors.Add(new Errore(line.Number, line.FileName, 1408, "")); return(true); } } } else if (token == Tokens.NUMBER) { if (!math) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1416, "")); return(true); } else { math = false; } if (type == VariableType.NON) { type = VariableType.NUMBER; } else if (type != VariableType.NUMBER) { if (firstType == VariableType.NON) { if (type == VariableType.STRING) { badString = true; type = VariableType.NUMBER; } } else if (firstType == VariableType.STRING) { badString = true; } if (!badString) { //Console.WriteLine('\n'); //Console.WriteLine(word.OriginText); Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else if (token == Tokens.STRING) { if (!math) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1416, "")); return(true); } else { math = false; } if (type == VariableType.NON) { type = VariableType.STRING; } else if (type != VariableType.STRING) { if (firstType == VariableType.NON) { if (type == VariableType.NUMBER) { badString = true; type = VariableType.STRING; } } if (!badString) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else if (token == Tokens.VARIABLE) { if (!VarContains(line, word.Text, word.OriginText)) { return(true); } var v = Data.Project.Variables[word.Text]; if (v.Type == VariableType.NUMBER) { if (!math) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1416, "")); return(true); } else { math = false; } if (type == VariableType.NON) { type = VariableType.NUMBER; } else if (type != VariableType.NUMBER) { if (firstType == VariableType.NON) { if (type == VariableType.STRING) { badString = true; type = VariableType.NUMBER; } } else if (firstType == VariableType.STRING) { badString = true; } if (!badString) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else if (v.Type == VariableType.STRING) { if (!math) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1416, "")); return(true); } else { math = false; } if (type == VariableType.NON) { type = VariableType.STRING; } else if (type != VariableType.STRING) { if (firstType == VariableType.NON) { if (type == VariableType.NUMBER) { badString = true; type = VariableType.STRING; } } if (!badString) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else if (v.Type == VariableType.NUMBER_ARRAY) { if (j + 1 < line.Count && line.Words[j + 1].Text == "[") { ArrayIndexErrorParser.Start(line, j + 1, Data.Project.Variables); if (Data.Errors.Count > 0) { return(true); } j = ArrayIndexErrorParser.LastIndex; if (!math) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1416, "")); return(true); } else { math = false; } if (type == VariableType.NON) { type = VariableType.NUMBER; } else if (type != VariableType.NUMBER) { if (firstType == VariableType.NON) { if (type == VariableType.STRING) { badString = true; type = VariableType.NUMBER; } } if (!badString) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else { if (array) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1425, "")); return(true); } if (addMath) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1418, "")); return(true); } if (type == VariableType.NON) { type = VariableType.NUMBER_ARRAY; } else if (type != VariableType.NUMBER_ARRAY) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else if (v.Type == VariableType.STRING_ARRAY) { if (j + 1 < line.Count && line.Words[j + 1].Text == "[") { ArrayIndexErrorParser.Start(line, j + 1, Data.Project.Variables); if (Data.Errors.Count > 0) { return(true); } j = ArrayIndexErrorParser.LastIndex; if (!math) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1416, "")); return(true); } else { math = false; } if (type == VariableType.NON) { type = VariableType.STRING; } else if (type != VariableType.STRING) { if (firstType == VariableType.NON) { if (type == VariableType.NUMBER) { badString = true; type = VariableType.STRING; } } if (!badString) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else { if (array) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1425, "")); return(true); } if (addMath) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1418, "")); return(true); } if (type == VariableType.NON) { type = VariableType.STRING_ARRAY; } else if (type != VariableType.STRING_ARRAY) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } } else if (token == Tokens.METHOD) { var tmpIndex = MethodErrorParser.GetMethodLastIndex(j, line, word.Text); if (tmpIndex == -1) { if (Data.Errors.Count > 0) { return(true); } Data.Errors.Add(new Errore(line.Number, line.FileName, 1314, "")); return(true); } else if (Data.Errors.Count > 0) { return(true); } else if (ParseMethodError(j, word.ToLower(), line)) { return(true); } var sign = DefaultObjectList.Get(word.ToLower()); if (sign.OutputType == VariableType.NON) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1306, "")); return(true); } else if (sign.OutputType == VariableType.NUMBER) { if (!math) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1416, "")); return(true); } else { math = false; } if (type == VariableType.NON) { type = VariableType.NUMBER; } else if (type != VariableType.NUMBER) { if (firstType == VariableType.NON) { if (type == VariableType.STRING) { badString = true; type = VariableType.NUMBER; } } else if (firstType == VariableType.STRING) { badString = true; } if (!badString) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else if (sign.OutputType == VariableType.NUMBER_ARRAY) { if (array) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1425, "")); return(true); } if (addMath) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1418, "")); return(true); } if (type == VariableType.NON) { type = VariableType.NUMBER_ARRAY; } else if (type != VariableType.NUMBER_ARRAY) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } else if (sign.OutputType == VariableType.STRING) { if (!math) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1416, "")); return(true); } else { math = false; } if (type == VariableType.NON) { type = VariableType.STRING; } else if (type != VariableType.STRING) { if (firstType == VariableType.NON) { if (type == VariableType.NUMBER) { badString = true; type = VariableType.STRING; } } if (!badString) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } } else if (sign.OutputType == VariableType.STRING_ARRAY) { if (array) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1425, "")); return(true); } if (addMath) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1418, "")); return(true); } if (type == VariableType.NON) { type = VariableType.STRING_ARRAY; } else if (type != VariableType.STRING_ARRAY) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); return(true); } } else if (sign.OutputType == VariableType.ANY) { if (word.ToLower().IndexOf("f.call") != -1) { type = VariableType.ANY; /* * if (j + 2 < line.Count) * { * var tmpName = line.Words[j + 2].Text.Replace("\"", ""); * if (Builder.Project.SubNames.ContainsKey(tmpName)) * { * if (type == VariableType.NON) * { * type = Builder.Project.SubNames[tmpName]; * } * else if (type != Builder.Project.SubNames[tmpName]) * { * Data.Errors.Add(new Errore(line.Number, line.FileName, 1407, "")); * return true; * } * } * } */ } } j = tmpIndex; } else if (token == Tokens.BRACKETLEFT || token == Tokens.BRACKETRIGHT || token == Tokens.BRACKETLEFTARRAY || token == Tokens.BRACKETRIGHTARRAY) { continue; } else { Data.Errors.Add(new Errore(line.Number, line.FileName, 1401, word.Text + " " + token)); return(true); } if (!plus && addMath) { if (oldType != VariableType.NON && ((oldType == VariableType.NUMBER && type == VariableType.STRING) || (oldType == VariableType.STRING && type == VariableType.NUMBER) || (oldType == VariableType.STRING && type == VariableType.STRING))) { Data.Errors.Add(new Errore(line.Number, line.FileName, 1417, "")); return(true); } } } if (type != VariableType.NON) { if (badString && type == VariableType.NUMBER) { type = VariableType.STRING; } if (!Data.Project.Variables.ContainsKey(varName)) { //Console.WriteLine("=================> " + varName + " " + type + " " + line.Number.ToString()); if (!array) { Data.Project.Variables.Add(varName, new Variable(varName) { Init = true, Type = type, Line = line }); } else { if (type == VariableType.NUMBER || type == VariableType.NUMBER_ARRAY) { Data.Project.Variables.Add(varName, new Variable(varName) { Init = true, Type = VariableType.NUMBER_ARRAY, Line = line }); } else if (type == VariableType.STRING || type == VariableType.STRING_ARRAY) { Data.Project.Variables.Add(varName, new Variable(varName) { Init = true, Type = VariableType.STRING_ARRAY, Line = line }); } } } } else { Data.Errors.Add(new Errore(line.Number, line.FileName, 1401, "")); return(true); } return(false); }