Esempio n. 1
0
 private void AddUsages(SemanticOperator @operator)
 {
     if (@operator is INameable nameable)
     {
         SemanticItem.AddUsages(nameable, RightOperand.Token);
     }
 }
Esempio n. 2
0
        internal void MakeLast()
        {
            SemanticItem last = _items.Last();

            _items.Remove(last);
            IsLast = true;
        }
Esempio n. 3
0
        public override string PrettyPrinter(EPrettyPrinterMode mode = EPrettyPrinterMode.WithBody, bool printNext = false, int tabLevel = 0)
        {
            SemanticItem bodyItem = _items.LastOrDefault(x => HasType(EItemType.Body)) ?? _items.Last();

            string firstLine = "";

            for (var i = 0; i < tabLevel; ++i)
            {
                firstLine += SystemNames.Tab;
            }

            for (var i = 0; i < _items.Count && _items[i] != bodyItem; ++i)
            {
                firstLine += _items[i].PrettyPrinter();
            }

            firstLine += bodyItem.PrettyPrinter();

            string childText = "";

            if (Child != null)
            {
                childText = "\n" + Child.PrettyPrinter(mode, true, tabLevel + 1);
            }

            string lastLine = "";

            if (bodyItem != _items.Last())
            {
                lastLine += "\n";
                for (var i = 0; i < tabLevel; ++i)
                {
                    lastLine += SystemNames.Tab;
                }

                var index = _items.IndexOf(bodyItem);
                for (var i = index + 1; i < _items.Count; ++i)
                {
                    lastLine += _items[i].PrettyPrinter();
                }
            }

            string nextLine = "";

            if (printNext && Next != null)
            {
                nextLine = "\n" + Next.PrettyPrinter(mode, true, tabLevel);
            }

            return(mode switch
            {
                EPrettyPrinterMode.FirstLine => firstLine,
                EPrettyPrinterMode.LastLine => lastLine,
                EPrettyPrinterMode.WithoutBody => firstLine + lastLine,
                EPrettyPrinterMode.WithBody => firstLine + childText + lastLine + nextLine,
                _ => null,
            });
Esempio n. 4
0
 public TypeParameter(SemanticItem parameters, string mode, bool isLast)
     : base(parameters)
 {
     _items   = new Grammar().CreateItems(this);
     ModeWord = (Word)_items.First(x => x.HasType(EItemType.ModeModifier));
     TypeWord = _items.First(x => x.HasType(EItemType.Type));
     ModeWord.SetText(mode);
     _items.Add(new Word(this, ", ", EItemType.Body));
 }
Esempio n. 5
0
 public void Focus(SemanticItem item, bool isInterrupted = false, bool isTextBody = false)
 {
     OldItem     = CurrentItem;
     CurrentItem = item;
     if (CurrentItem is SemanticOperator)
     {
         CurrentOperator = (SemanticOperator)CurrentItem;
     }
     else
     {
         CurrentOperator = CurrentItem.Operator;
     }
 }
Esempio n. 6
0
        internal override void CopyFrom(SemanticItem item)
        {
            var parameter = (TypeParameter)item;

            IsLast = parameter.IsLast;
            _items.Clear();

            for (var i = 0; i < parameter._items.Count; ++i)
            {
                _items.Add(parameter._items[i] is SimpleType
                    ? new SimpleType(this, "", EItemType.General)
                    : new Word(this, "", EItemType.General));
                _items[i].CopyFrom(parameter._items[i]);
            }

            ModeWord = (Word)_items.First(x => x.HasType(EItemType.ModeModifier));
            TypeWord = _items.First(x => x.HasType(EItemType.Type));
        }
Esempio n. 7
0
 public ClassParameter(SemanticItem item)
     : base(item)
 {
 }
Esempio n. 8
0
 public List <SemanticItem> CreateItems(SemanticItem semanticItem)
 {
     _result = new List <SemanticItem>();
     return(_result);
 }
Esempio n. 9
0
 internal override void CopyFrom(SemanticItem item)
 {
     throw new NotImplementedException();
 }
Esempio n. 10
0
 public ProcedureType(SemanticItem parent)
     : base(parent)
 {
 }
Esempio n. 11
0
 internal override void InsertItem(int index, SemanticItem item)
 {
     throw new NotImplementedException();
 }
Esempio n. 12
0
 public ArrayType(SemanticItem parent)
     : base(parent)
 {
 }
Esempio n. 13
0
 public Expression(SemanticItem item) : base(item)
 {
     _items.Add(new Token(this, "", ETokenType.Operand));
     BuildTree();
 }
Esempio n. 14
0
        private SemanticOperator GetOperatorFromSimpleType(SimpleType leftType)
        {
            if (StringAnalyzer.IsClassOrModuleMember(leftType.Text))
            {
                var classOrModuleName = StringAnalyzer.GetClassOrModuleName(leftType.Text);
                var memberName        = StringAnalyzer.GetMemberName(leftType.Text);

                if (Token.Tree.Project.HasModuleWithName(classOrModuleName))
                {
                    var tree   = Token.Tree.Project.GetModuleByName(classOrModuleName);
                    var record = tree.GetDeclaredTypes().FirstOrDefault(x => x.NameWord.Text == memberName);
                    // record?.
                    if (record != null)
                    {
                        var member = record.GetMembers()
                                     .FirstOrDefault(x => ((INameable)x).NameWord.Text.Equals(Name));

                        if (member != null)
                        {
                            return(member);
                        }

                        SemanticError error = null;
                        if (Parent is FunctionToken)
                        {
                            error = new ClassMissingMethod(Token.Operator, RightOperand.Words, record, Name);
                        }
                        else if (Parent is ArrayToken)
                        {
                            error = new ClassMissingArray(Token.Operator, RightOperand.Words, record, Name);
                        }
                        else
                        {
                            error = new ClassMissingField(Token.Operator, RightOperand.Words, record, Name);
                        }

                        GenerateFind(error);
                    }
                }
            }
            else
            {
                var record = Token.Tree.GetDeclaredTypes()
                             .FirstOrDefault(x => x.NameWord.Text.Equals(leftType.Text));

                if (record != null)
                {
                    var member = record.GetMembers()
                                 .FirstOrDefault(x => ((INameable)x).NameWord.Text.Equals(Name));

                    if (member != null)
                    {
                        return(member);
                    }

                    SemanticError error = null;
                    if (Parent is FunctionToken)
                    {
                        error = new ClassMissingMethod(Token.Operator, RightOperand.Words, record, Name);
                    }
                    else if (Parent is ArrayToken)
                    {
                        error = new ClassMissingArray(Token.Operator, RightOperand.Words, record, Name);
                    }
                    else
                    {
                        error = new ClassMissingField(Token.Operator, RightOperand.Words, record, Name);
                    }

                    GenerateFind(error);
                }
                else
                {
                    var import = Token.Tree.GetImports()
                                 .FirstOrDefault(x => x.NameWord.Text.Equals(leftType.Text));

                    if (import != null)
                    {
                        if (!Token.Tree.Project.HasModuleWithName(import.NameWord.Text))
                        {
                            GenerateFind(new UndeclaredModule(Token.Operator, LeftOperand.Words, import.NameWord.Text));
                        }
                        else
                        {
                            var tree   = Token.Tree.Project.GetModuleByName(import.NameWord.Text);
                            var module = tree.FindModule();

                            if (module != null)
                            {
                                SemanticItem.AddUsages(module, LeftOperand.Token);
                                var member = tree.GetMembers()
                                             .FirstOrDefault(x => ((INameable)x).NameWord.Text.Equals(Name));

                                if (member != null)
                                {
                                    return(member);
                                }

                                SemanticError error = null;
                                if (Parent is FunctionToken)
                                {
                                    error = new ModuleMissingFunction(Token.Operator, RightOperand.Words, tree.FindModule(), Name);
                                }
                                else if (Parent is ArrayToken)
                                {
                                    error = new ModuleMissingArray(Token.Operator, RightOperand.Words, tree.FindModule(), Name);
                                }
                                else
                                {
                                    error = new ModuleMissingVariable(Token.Operator, RightOperand.Words, tree.FindModule(), Name);
                                }

                                GenerateFind(error);
                            }
                        }
                    }
                }
            }

            return(null);
        }
Esempio n. 15
0
 public override SemanticItem GetPreviousItem(SemanticItem currentItem)
 => throw new NotImplementedException();
Esempio n. 16
0
        public override ISemanticType GetSemanticType()
        {
            if (Function is DotToken dotToken)
            {
                dotToken.GetSemanticType();
                if (dotToken.LeftType is ArrayType && SystemNames.ArraySizes.Contains(dotToken.Name))
                {
                    return(SimpleType.Integer);
                }

                var subprogram = dotToken.GetSubprogram();
                if (subprogram != null)
                {
                    ValidateParameters(subprogram.ParametersWord);
                    return(GetSubprogramType(subprogram));
                }

                GenerateFind(new ObjectIsNotSubprogram(
                                 dotToken.RightOperand.Token.Operator,
                                 dotToken.RightOperand.Token.Words,
                                 dotToken.RightOperand.Token.Text));
            }
            if (Function is OperandToken operandToken)
            {
                if (operandToken.Name.Equals(SyntaxNames.New))
                {
                    const int formalCount = 1;
                    var       actualCount = Arguments.Count;
                    for (var i = 0; i < actualCount; ++i)
                    {
                        var actualType = Arguments[i].GetSemanticType();
                        if (i < formalCount)
                        {
                            if (!actualType.IsUserType)
                            {
                                GenerateFind(new ArgumentHasIncorrectType(Token.Operator, Arguments[i].Words));
                            }
                        }
                    }

                    if (actualCount != formalCount)
                    {
                        GenerateFind(new IncorrectArgumentCount(Token.Operator, Function.Words, actualCount, formalCount));
                        return(SimpleType.Undefined);
                    }

                    return(new PointerType(null)
                    {
                        TypeWord = (SemanticItem)Arguments[0].GetSemanticType()
                    });
                }

                if (operandToken.Name.StartsWith(SystemNames.SystemFuncDog))
                {
                    foreach (var token in Arguments)
                    {
                        token.GetSemanticType();
                    }

                    return(SimpleType.SystemType);
                }

                var name = Token.GetNameInSameScope(operandToken.Name);
                if (name is Subprogram subNameable)
                {
                    SemanticItem.AddUsages(name, Function.Token);
                    ValidateParameters(subNameable.ParametersWord);
                    return(GetSubprogramType(subNameable));
                }

                if (name is TypeParameter {
                    TypeWord : ProcedureType type
                })
Esempio n. 17
0
 protected SimpleItem(SemanticItem parent)
     : base(parent)
 {
 }
Esempio n. 18
0
 public override SemanticItem GetNextItem(SemanticItem currentItem)
 {
     return(null);
 }
Esempio n. 19
0
 public TextBody(SemanticItem parent)
     : base(parent)
 {
 }
Esempio n. 20
0
 public PointerType(SemanticItem parent)
     : base(parent)
 {
 }
Esempio n. 21
0
 public override SemanticItem GetPreviousItem(SemanticItem currentItem)
 {
     return(null);
 }
Esempio n. 22
0
 protected static void GenerateFind(SemanticFind find) => SemanticItem.GenerateFind(find);
Esempio n. 23
0
 public override SemanticItem GetNextItem(SemanticItem currentItem)
 {
     throw new NotImplementedException();
 }