Esempio n. 1
0
        private static IEnumerable<Error> ResolveRefType(RefType type, Node var)
        {
            var errors = new List<Error>();

            var actual = var.GetNearestParent<Program>().GetSubChildren<Record>().Where(x => x.Name.Text == type.Name.Text).ToList();
            if (actual.Count == 0)
                errors.Add(new Error(var.GetSourceIdentifier(), type.Name,
                                     string.Format(ErrorMessages.TypeNotFound, type.Name.Text)));
            if (actual.Count == 1)
                return errors;

            if (actual.Count > 1)
                errors.Add(new Error(var.GetSourceIdentifier(), type.Name,
                                     string.Format(ErrorMessages.MultipleTypeMatch, string.Join(";", actual))));

            return errors;
        }
Esempio n. 2
0
        private static IEnumerable<Error> ResolveIdType(Node root, IToken token, out Node newRoot, out IType type)
        {
            var errors = new List<Error>();

            newRoot = null;
            type = null;

            if ((!root.GetSubChildren<Variable>().Select(x => x.Name.Text).Contains(token.Text)) && (root.Name.Text != token.Text))
                errors.Add(new Error(root.GetSourceIdentifier(), token,
                                     string.Format(ErrorMessages.VariableNotFound, token.Text)));

            else
            {
                if ((root.Name.Text == token.Text) && (root is Function))
                {
                    type = ((Function) root).ReturnType;
                    return errors;
                }
                var var = new Variable();
                try
                {
                    var = root.GetSpecifiedChildren<Variable>().First(x => x.Name.Text == token.Text);
                }
                catch
                {
                    errors.Add(new Error(root.GetSourceIdentifier(), token,
                                     string.Format(ErrorMessages.VariableNotFound, token.Text)));
                    return errors;
                }
                type = var.Type;
                if (var.Type.GetTypeInfo() == TypeInfo.Ref)
                {
                    newRoot =
                        root.GetNearestParent<Program>()
                            .GetSpecifiedChildren<Record>().First(x => x.Name.Text == var.Type.ToString());
                }
            }
            return errors;
        }
Esempio n. 3
0
        public static List<Error> ResloveExpression(Node root, Expression expr, out IType type)
        {
            var errors = new List<Error>();

            var list = ExpressionBuilder.Build(expr);

            foreach (var exprNode in list.Where(exprNode => exprNode.ExprType == ExprType.Var))
            {
                errors.AddRange(IdentifierResolver.ResloveIdentifierType(root, exprNode.Tokens, out type));
                exprNode.Type = type;
            }

            type = list.First().Type;
            foreach (var node in list)
            {
                if ((node.Type != null) && (node.Type.ToString() != type.ToString()))
                {
                    errors.Add(new Error(root.GetSourceIdentifier(), node.Tokens.First(),
                                         string.Format(ErrorMessages.TypeMismatch, node.Type.ToString(), type.ToString())));
                }
            }

            return errors;
        }