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; }