예제 #1
0
        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;
            }
        }
예제 #2
0
        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);
        }