示例#1
0
        public override void CheckSemantics(TigerScope scope, Report report)
        {
            ContainingScope = scope;

            //Check children
            IdNode.CheckSemantics(scope, report);

            FunctionScope = new TigerScope(scope, IdNode.Name);

            ParameterDeclarationNodes.ToList().ForEach(p => p.CheckSemantics(FunctionScope, report));

            if (!IdNode.IsOK || ParameterDeclarationNodes.Any(p => !p.IsOK))
            {
                return;
            }

            //Check existence of function name
            if (!scope.FunctionNameAvailable(IdNode.Name))
            {
                report.AddError(SemanticErrors.FunctionNameAlreadyInUse(IdNode, IdNode.Name));
                return;
            }

            if (ReturnTypeNode != null)
            {
                ReturnTypeNode.CheckSemantics(scope, report);
                if (!ReturnTypeNode.IsOK)
                {
                    return;
                }
                FunctionInfo = scope.DefineFunction(IdNode.Name, ReturnTypeNode.TigerType,
                                                    ParameterDeclarationNodes.Select(p => p.TypeNode.TigerType).ToArray(), FunctionScope);
            }
            else
            {
                FunctionInfo = scope.DefineFunction(IdNode.Name, TigerType.Void,
                                                    ParameterDeclarationNodes.Select(p => p.TypeNode.TigerType).ToArray(), FunctionScope);
            }
            IsOK = true;
        }