Пример #1
0
        public override void CheckSemantics(TigerScope scope, Report report)
        {
            ContainingScope = scope;

            //Checking children
            IdNode.CheckSemantics(scope, report);
            Arguments.ToList().ForEach(e => e.CheckSemantics(scope, report));

            if (!IdNode.IsOK || Arguments.Any(e => !e.IsOK))
            {
                return;
            }

            //Checking existence of function
            FunctionInfo = scope.FindFunction(IdNode.Name);

            if (FunctionInfo == null)
            {
                report.AddError(SemanticErrors.NonExistentFunctionReference(IdNode, IdNode.Name));
            }
            else
            {
                TigerType = FunctionInfo.ReturnType;

                //Checking parameters
                if (Arguments.Length != FunctionInfo.ParameterNumber)
                {
                    report.AddError(SemanticErrors.WrongNumberOfParameters(IdNode, FunctionInfo.Name,
                                                                           FunctionInfo.ParameterNumber, Arguments.Length));
                }
                else
                {
                    for (int i = 0; i < Arguments.Length; i++)
                    {
                        if (!FunctionInfo.Parameters[i].Assignable(Arguments[i].TigerType))
                        {
                            report.AddError(SemanticErrors.InvalidArgumentType(Arguments[i], Arguments[i].TigerType, FunctionInfo.Parameters[i]));
                        }
                    }
                }
            }
        }